我很新使用object.create而不是传统的js方式来实现原型继承。Object.create设置__proto__但不是原型
在Chrome中,至少我很惊讶地看到下面的代码:
var baseObject = {
test : function(){
console.log('Child');
}
}
var newObject = Object.create(baseObject);
newObject.test = function(){
console.log('Parent');
this.__proto__.test();
}
console.log(newObject);
newObject.test();
产生以下(模拟的Web工具的输出):
Object {test: function, test: function}
test: function(){
__proto__: Object
test: function(){
__proto__: Object
Parent
Child
所以你看它不设置原型,但而不是只有“__proto__”,我认为它的使用是不鼓励的。你可以看到,在我的代码中,我可以正确地继承,并调用父对象,但只能使用“__proto__”。使用“原型”会导致错误(未定义)。
这是怎么回事吗?我想object.create会设置“原型”,因为这是标准(或我所假设的)。为什么填充并使我使用“__proto__”
非常有趣。你是对的,我忘了原型只适用于功能。所以基本上,至少是铬,使用__proto__类型的复制原型以非标准方式用于计划对象? – nahelm 2013-03-05 21:44:12
@nahelm:排序。 '__proto__'可以让你给现有的对象一个新的原型链。构造函数和Object.create只是让你在创建对象时进行设置。从那里它是永久的。事实上,如果你从构造函数中创建一个对象,那么你给构造函数一个新的'.prototype'对象,你创建的对象仍然会引用原始对象。它永远不会改变。 – 2013-03-05 21:47:13
我想我终于明白了。我的一部分困惑是,我期望我的网络工具在Chrome中显示我创建的对象的原型。我也想过一些愚蠢的理由,即使用new关键字可以使用prototype关键字(在你的例子中是f.prototype),这是不正确的。当我做了你的Foo例子并在其原型中添加了一个函数时,当我使用console.log(f)时,该函数也显示在__proto__对象中。因此,本质上__proto__暴露了通常隐藏的原型链,正如您所说的永久链接。 – nahelm 2013-03-06 22:07:46