快速说明:请不要在答案中解释 javascript 继承的基础知识。
这是一个简单的构造函数,它的原型成员附加了一些属性。
function Foo() {
this.relationship = "Love";
};
Foo.prototype.name = "Natalie";
Foo.prototype.age = 22;
Foo.prototype.country = "France";
现在我们用 Foo 创建新对象并测试一些基础知识。一切都很酷。
var girl = new Foo();
girl.hasOwnProperty("relationship"); //=> true
girl.hasOwnProperty("name"); //=> false
girl.relationship; //=> "Love"
girl.name; //=> "Natalie", this comes from Foo.prototype
girl.__proto__ === Foo.prototype; //=> true
girl.__proto__.name === Foo.prototype.name; //=> true
girl.name === Foo.prototype.name; //=> true
如果我们更新 Foo.prototype.name 属性的值,girl.name 应该会指向新值。
Foo.prototype.name = "Lucia";
girl.name; //=> "Lucia", this comes from Foo.prototype
当我们更改 Foo.prototype 并将其设为 null、未定义、空对象等时,会发生神秘的事情。
Foo.prototype = null;
如果我们的女孩对象有一个隐藏的__ proto__
(ECMA [[Prototype]]) 链接到 Foo.prototype,那么在使 Foo.prototype为null之后,女孩应该没有机会获得name属性,但确实如此!
girl.name; //=> "Lucia"
girl.age; //=> 22
girl.country; //=> "France"
现在,如果我们此时使用 Foo 创建另一个对象。它没有name、age和country,因为当然 Foo.prototype 是空的。
var new_girl = new Foo();
new_girl.name; //=> undefined
new_girl.age; //=> undefined
new_girl.country; //=> undefined
所以我的问题是,在我们将 Foo.prototype 分配给null之后,之前的对象(女孩)和他的隐藏链接如何记住这些属性?__ proto__