function Person() {}
Person.prototype.name = 'Nicholas';
const p1 = new Person();
console.log(p1.name); // Nicholas
p1.name = 'Greg';
console.log(p1.__proto__.name); // Nicholas
// 为什么上面输出不是 'Greg'
代码如上。name
属性是在构造函数Person
的原型上的。当我实例化p1
时,修改了name
的值,因为p1
实例本身没有name
属性,所以就会去原型上找。而p1
实例对原型是一种引用,所以按照正常逻辑,不应该原型上的name
属性也会被修改吗?
1、
重点是这句代码,他不会修改原型的
name
,而是直接设置 实例 的name
,不管原型上有没有,如果实例上有name
就覆盖,没有就设置;2、如果你单独访问属性:
这样,在实例上没有
name
属性时,才会去原型链上找;3、
错误,
Object.getPrototypeOf(p1)
、p1.constructor.prototype
才是对p1
原型的引用4、不要用
__proto__
属性,如果要访问实例的原型用Object.getPrototypeOf
设置原型用Object.setPrototypeOf