关键词: 构造函数, prototype
先创建实例,后修改prototype
尽管最后重写了构造函数的prototype,但实例对象的__proto__仍然指向最初的prototype
function Foo() {}
console.log(Foo.prototype) // {constructor: Foo()}
let foo = new Foo
// 修改prototype为新的对象
Foo.prototype = {
age: 100
}
console.log(foo.__proto__) // {constructor: Foo()}
console.log(foo.age) // undefined
foo 本身没有 age 属性,且 Foo 最初的 prototype 上只有一个 constructor 属性,也没有 age 属性,所以会返回 undefined
先修改prototype,后创建实例
在创建实例对象之前就已经修改 Foo.prototype 为一个新的对象,即该实例对象的__proto__指向的是这个新的 prototype,foo.age 的值为 100
function Foo() {}
console.log(Foo.prototype) // {constructor: Foo()}
// 修改prototype为新的对象
Foo.prototype = {
age: 100
}
console.log(Foo.prototype) // Foo.prototype已经修改为:{age: 100}
let foo = new Foo
console.log(foo.__proto__) // {age: 100}
console.log(foo.age) // 100
参考: JavaScript高级程序设计(第3版)-第156页