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--zhangconsole.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不等于它的构造函数了,那么就可以确认,已经断链了,如果还是等于构造函数的名称,那也不能确定就没有断链,就是说,不等的话,就肯定是断链了,等的话,就不能确定是否断链了,那再去找其他的因素确认吧。
只是把问题描述了一下,做了个比较,没有进行分析原因,留着吧。。
如果您发现文中,有错误或者描述不当,或者还有其他可添加内容,感谢您能指正。谢谢!