【发布时间】:2016-05-15 05:15:07
【问题描述】:
下面有一段代码:
function Foo(name){
this.name = name;
}
Foo.prototype.myName = function() {
return this.name;
}
function Bar(name, label){
Foo.call(this, name);
this.label = label;
}
Bar.prototype = Object.create(Foo.prototype);
Bar.prototype.myLabel = function(){
return this.label;
}
var a = new Bar("a" , "obj a");
a.myName();
a.myLabel();
好的,现在按照我的理解
- 它创建了一个函数
Foo来设置名称 - 它在 Foo 的链接原型对象上创建一个函数
myName。 - 它创建了一个函数
Bar,它只设置标签并使用函数Foo 的功能来设置名称,而不是自己设置。 - 然后在Foo和Bar之间建立原型链接。所以我假设 Foo 和 Bar 分别有两个独立的原型对象相互链接。
- 现在 Bar 的原型对象内部有一个函数
myLabel。 - 对 new Bar 的调用会创建一个新对象
a并将其原型对象链接到 Bar 的原型。
所以 takeways 是:
Foo 的原型包含一个 get 函数 -
myNameFoo 本身只是设置了一个属性名
Bar 的原型有一个 get 函数 -
myLabelBar 本身只是设置一个属性 - mylabel
对象
a's原型链接到Bar's prototype,而Bar's prototype本身链接到Foo's prototype。所以总共有三个原型对象。
这种思路正确吗?请更正或添加一些内容以启发讨论。我对这门语言相当陌生,它的细微差别几乎没有原型的用例/实际示例。
【问题讨论】:
-
“所以总共有三个原型对象。” - 不太对。对象
a的原型与Bar.prototype属性引用的对象相同。Bar.prototype属性不是Bar对象的原型,它将成为通过new Bar()创建的任何对象的原型。 (Bar是一个函数,也是一个对象,它有自己的原型,与Bar.prototype所指的完全无关。) -
好的。所以 Bar.prototype (或新调用后的任何对象的原型)和 Foo.prototype 再次引用同一个原型对象......这是正确的吗?
-
不,
Bar.prototype和Foo.prototype引用不同的对象。 (抱歉,但深入解释这一点超出了我可以在评论中做的事情,我没有时间写一个彻底的答案。) -
了解到一共有2个原型对象。 Foo 和其他通过 new 调用创建的任何对象之一,它们相互链接。
-
那种。还有一些其他原型与作为对象的函数相关联,但它们在这里不相关。我建议阅读以下问题及其一些链接副本:stackoverflow.com/questions/9959727/… - 有图片可以帮助显示链接。
标签: javascript prototype new-operator