分享一道原型的题目

function P() {}
var p1 = new P();
P.prototype.age = 18;
P.prototype = {
    constructor: P,
    name: 'zz'
}
P.prototype.num = 20;
P.prototype.age = 22;
console.log(p1.name);
console.log(p1.age, 'dd');
console.log(p1.num);
var p2 = new P();
console.log(p2.name);
console.log(p2.num);
console.log(p2.age);

里面依次输出为:
undefined;18,'dd';undefined;zz;20;22
分析:
这里主要考察的是,实例到是跟哪个原型对象有委托关系的;
首先p1是跟原P的原型对象有委托关系,即他会有age;
但是后面P重写了原型,P.prorotype会创建一个新的原型对象,而p1.__proto__仍然指向原来的那个旧的原型对象;
所以p1的name,num都是undefind,他是指向旧的原型链,而旧的原型链上没有这些属性。
p2实例化的时候,原型已经重写了,p2.__proto__指向新的原型对象,会有重写之后的属性,如name,num,新age;
即可以通过原型链上看

console.log(p1.__proto__ === P.prototype); //false

console.log(p2.__proto__ === P.prototype); //true

猜你喜欢

转载自www.cnblogs.com/ssszjh/p/12915229.html