原型链断链的情况

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不等于它的构造函数了,那么就可以确认,已经断链了,如果还是等于构造函数的名称,那也不能确定就没有断链,就是说,不等的话,就肯定是断链了,等的话,就不能确定是否断链了,那再去找其他的因素确认吧。

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


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

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页