天天看点

原型链断链的情况javascript中的原型链,大家都该知道的吧,我就不多说了,直接说问题吧。

javascript中的原型链,大家都该知道的吧,我就不多说了,直接说问题吧。

        在对象的应用过程中,可能经常会对构造函数添加或修改原型链方法或者属性,这个时候,如果在后面添加时,出现原型链断链的情况,那么后面新定义的方法,对之前定义的实例就不再起左右,而之后定义的实例,就只有新定义的方法或者属性,而没有之前的方法和属性,这就是断链造成的影响。

        感觉说的有点绕,直接写例子吧!

1:以对象字面量的形式定义添加原型方法或者函数.

定义一个Person作为构造函数

function Person(){

this.name = "zhang";

}

Person.prototype.age = "2";

//这个时候,定义一个实例

var person1 = new Person();

console.log(person1.age);        //结果显示2

之后呢,我想要给原型链上面加几种方法,对象字面量的写法最简单明了,所以我这样加了

Person.prototype = {

fam:"asdf",

sayName:function(){

alert(this.name);

}

}

我又定义了另外一个实例

var person2 = new Person();

我现在想要看看,这两个实例所包含的属性和方法

console.log(person1.name +"--"+ person2.name);      //zhang--zhang

console.log(person1.age +"--"+ person2.age);        //2--undefined

console.log(person1.fam +"--"+ person2.fam);        //undefined--asdf

console.log(person1.sayName +"--"+ person2.sayName);//undefined--function(){alert(this.name)}

好吧,断链了吧。这个原因呢,因为用字面量添加原型时,constructor属性的值变了,经过字面量的添加原型,字面量默认的constructor值是object,所以,此时的Person的constructor的值,看下他们的constructor值如下:

console.log(person1.constructor == Object);     //false

console.log(person1.constructor == Person);     //true

console.log(person2.constructor == Object);     //true

console.log(person2.constructor == Person);     //false

//虽然可以在字面量添加原型链时,可以自定义constructor属性,不过,依然会断链。

2:继承时,会断链。

function Person(){

this.name = "zhang";

}

Person.prototype.age = "2";

function Employ(){

}

Employ.prototype.company = "aaa";

Employ.prototype = new Person();

var employ1 = new Employ();

console.log(employ1.name);           //zhang

console.log(employ1.age);            //2

console.log(employ1.company);        //undefined

console.log(employ1.constructor == Person);   //true

console.log(employ1.constructor == Employ);   //false

反正是断链了,所以,如果要继承,那么就要注意了,在最开始的时候,继承,并且,不要和对象字面量定义原型链方法放到一起啊,放到一起的话,铁定断链的,所以。。。

3:单独继承原型链上的方法

function Person(){

this.name = "zhang";

}

Person.prototype.age = "2";

function Employ(){

}

Employ.prototype.company = "aaa";

Employ.prototype = Person.prototype;

var employ1 = new Employ();

console.log(employ1.name);           //undefined

console.log(employ1.age);            //2

console.log(employ1.company);        //undefined

console.log(employ1.constructor == Person);   //true

console.log(employ1.constructor == Employ);   //false

又断链了

总的看来,如果是employ1.constructor不等于它的构造函数了,那么就可以确认,已经断链了,如果还是等于构造函数的名称,那也不能确定就没有断链,就是说,不等的话,就肯定是断链了,等的话,就不能确定是否断链了,那再去找其他的因素确认吧。

只是把问题描述了一下,做了个比较,没有进行分析原因,留着吧。。

如果您发现文中,有错误或者描述不当,或者还有其他可添加内容,感谢您能指正。谢谢!

继续阅读