先说个总结
1.对象有属性__proto__
,指向该对象的构造函数的原型对象。
2.方法除了有属性__proto__
,还有属性prototype
,prototype
指向该方法的原型对象
3.prototype.__proto__
都指向Object.prototype
关系图
相关题目
function person() { }
person.prototype = { atrr1: 'aaaa',atrr2: 'bbbb' }
var obj = new person();
console.log(obj.atrr1);
console.log(obj.atrr2);
console.log(obj instanceof person);
console.log('**********************************');
person.prototype = {};
console.log(obj.atrr1);
console.log(obj.atrr2);
console.log(obj instanceof person);
console.log('**********************************');
console.log(obj.__proto__);
console.log(person.prototype);
先讲个容易入坑的知识点
instanceof
是根据原型链来判断实例是否属于某个类型。
误解
因实例的__proto__
指向的是类的prototype
,因此可能会认为,当类的prototype
发生改变时,实例__proto__也发生了改变,所以__proto__也是新的。
这就打错特错了。
解释
实例的__proto__指向类的prototype不错,但是他们指向的都是一个地址。他们不过是地址的“变量”而已,而变量是可以指向一个新的地址,但是老的地址并不会因为变量的改变而改变。老的地址还是存在的。
所以上面的题,当改变person的prototype指向时,他们是不相等的,因为他们分别指向了不同的地址。
更直接的例子
var man={name:'lisi'};
var woman=man;
man={name:'zhangsan'}
man只是一个变量,当指向新的地址时,lisi还在那。