【问题标题】:Prototypes and usage Javascript原型和使用 Javascript
【发布时间】: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();

好的,现在按照我的理解

  1. 它创建了一个函数Foo 来设置名称
  2. 它在 Foo 的链接原型对象上创建一个函数myName
  3. 它创建了一个函数Bar,它只设置标签并使用函数Foo 的功能来设置名称,而不是自己设置。
  4. 然后在Foo和Bar之间建立原型链接。所以我假设 Foo 和 Bar 分别有两个独立的原型对象相互链接。
  5. 现在 Bar 的原型对象内部有一个函数 myLabel
  6. 对 new Bar 的调用会创建一个新对象 a 并将其原型对象链接到 Bar 的原型。

所以 takeways 是:

  • Foo 的原型包含一个 get 函数 - myName

  • Foo 本身只是设置了一个属性名

  • Bar 的原型有一个 get 函数 - myLabel

  • Bar 本身只是设置一个属性 - 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.prototypeFoo.prototype 引用不同的对象。 (抱歉,但深入解释这一点超出了我可以在评论中做的事情,我没有时间写一个彻底的答案。)
  • 了解到一共有2个原型对象。 Foo 和其他通过 new 调用创建的任何对象之一,它们相互链接。
  • 那种。还有一些其他原型与作为对象的函数相关联,但它们在这里不相关。我建议阅读以下问题及其一些链接副本:stackoverflow.com/questions/9959727/… - 有图片可以帮助显示链接。

标签: javascript prototype new-operator


【解决方案1】:

首先要枚举Foo.prototype

Foo.prototype = { constructor: Foo, myName: function() { return this.name}};

然后Bar 调用Foo 将“名称”应用于正在构造的 Bar 实例,而不是自己执行,然后将其第二个参数设置为新的 Bar 对象属性。

Bar.prototype 设置为{} 典型地继承自Foo.prototype。比如Bar.prototype.constructor == Foo; // true

Bar.prototype 被分配了一个本地自己的属性方法myLabel,可以被Bar 对象继承,但不能被Foo 对象继承。

所以第 1,2,3 点是正确的。

第 4 点不正确。建立了一个原型继承,使得Bar.prototype 继承自Foo.prototype。它不是相互的,是一种单向继承:JavaScript 不支持任何类型的双向原型继承。

第 5 点和第 6 点是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2023-03-16
    • 2013-02-22
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多