【问题标题】:Setting __proto__ of prototype of a Constructor设置构造函数原型的 __proto__
【发布时间】:2013-12-23 17:18:34
【问题描述】:

我从 Base 类继承到 Derived 类,如下所示:

Base is ViewDerived is ItemVIew

function ItemView(){
View.call(this);
}

ItemView.prototype.__proto__ = View.prototype 

以上这些都可以实现吗

Iteview.prototype = new View;

我还有一个问题

当我设置ItemView.prototype.__proto__ = View.prototype ,ItemView的原型是Function.prototype 这意味着我正在设置Function.prototype.__proto__ = View.prototype 所以View.prototype 的所有方法都被我定义的所有其他构造函数继承?

我可以通过ItemView.__proto__ = View.prototype 解决它吗?

扩展像 View 这样的基类以使 ItemView 仍然是构造函数的推荐方式是什么?

【问题讨论】:

  • 原型的 _proto 是一个对象或者它的构造函数。你在实例上使用 _proto,在构造函数上使用 .prototype。它本质上与 instance.constructor.prototype 相同。

标签: javascript inheritance constructor


【解决方案1】:

ItemView.prototype 引用的对象将被分配为通过new ItemView 创建的对象的底层原型。 ItemView.prototype.__proto__ 很可能(在有它的实现上)是Object.prototype

但是不,你不想做ItemView.prototype = new View(); -- 如果View 需要参数怎么办?这是一个很常见的错误。

相反,在 ES5 之前的环境中:

function Temp() {
}
Temp.prototype = View.prototype;
ItemView.prototype = new Temp();
ItemView.prototype.constructor = ItemView;

在 ES5 环境中:

ItemView.prototype = Object.create(View.prototype);
ItemView.prototype.constructor = ItemView;

...并继续在ItemView 中执行您的View.call(this)

【讨论】:

  • ItemView.prototype.constructor = View 需要什么?
  • @RanaDeep:纯粹是约定俗成的。这就是 JavaScript 函数上默认的 prototype 对象的设置方式,所以我们确保我们做同样的事情。这有点奇怪:specification says it creates that property(第 17 步),这让你觉得它很重要;但它实际上并没有将该属性使用。 (例如,它不与 instanceof 一起使用。)模仿引擎默认执行的操作真的很便宜,所以我总是这样做。
  • @RanaDeep:顺便说一句,你可能会发现我的继承层次结构 (Lineage) 的帮助脚本很有用,如果不是因为脚本本身,可能只是因为 this documentation page 显示使用它与不使用它(例如,在没有帮助的情况下做同样的事情)。
  • 谢谢,另外,如果我设置 ItemView.prototype.__proto__ = View.prototype,因为 ItemView.prototype 是 Function.prototype,这意味着我设置 Function.prototype.__proto__ = View.Prototype ?这是否意味着每个构造函数都获得了 View.prototype 的方法?
  • @RanaDeep:不,那个对象只是一个对象。 (请参阅我上面链接的那些步骤。)函数对象上的 prototype 属性与 函数的 原型无关,这将是(例如)ItemView.__proto__(在具有它的实现上)。 ItemView.__proto__ 将是 Function.prototype 除非你改变它(这是不寻常的)。除了规范、Lineage 代码(上图)和a few blog posts I've done 之外,我没有什么可参考的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2012-03-09
  • 2011-06-24
相关资源
最近更新 更多