【问题标题】:Reusing functions of a prototype重用原型的功能
【发布时间】:2015-08-25 18:26:51
【问题描述】:

我正在阅读《JavaScript Ninja 的秘密》(http://jsninja.com/) 一书,我想知道为什么其中一个示例中的某个代码块是这样编码的。

示例 (http://jsfiddle.net/3s5bopqe/3/) 构建了一个自定义数组类型 (MyArray) 并重用了 Array.prototype 中的许多函数,而实际上并未从“Array”类型继承。

在书中的示例中,使用此代码在自定义类型的原型中重用了具有特定名称的函数

    MyArray.prototype[ name ] = function() {
      return Array.prototype[ name ].apply(this, arguments);
    };

我相信我明白这里发生了什么。但对我来说,实际使用函数文字并显式“应用”来自 Array.prototype 的函数似乎没有必要。以下代码在测试设置中同样有效:

 MyArray.prototype[ name ] = Array.prototype[ name ];

我的问题是使用书中的代码是否比上一个代码块有任何优势?

【问题讨论】:

  • 偏好。许多 JS 代码,尤其是 JQuery 中的代码,都以书中列出的格式工作。一致性总是好的。

标签: javascript prototype-programming


【解决方案1】:

通过使用

 MyArray.prototype[ name ] = Array.prototype[ name ];

您实际上是在将方法从 Array 复制到您的对象 (MyArray) 中。 将来,如果 Array 方法发生变化,您的 MyArray 方法将不会更新。

通过使用

MyArray.prototype[ name ] = function() {
      return Array.prototype[ name ].apply(this, arguments);
    };

你提到了数组方法。在 Array 对象方法中所做的更改会反映在您的 MyArray 方法中。为什么?因为您从未复制过该方法,所以您只是借用了它(指的是它当前的实现)。

【讨论】:

    【解决方案2】:

    我可以看到一个主要区别。如果 Array.prototype 上的任何目标方法在您复制它们后被更改(例如应用修复行为的 polyfill),则使用 MyArray.prototype[ name ] = Array.prototype[ name ]; 不会反映更改,而使用 jsninja 方法。

    根据您的观点,您可能会发现其中一种行为更合适。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-28
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2011-05-02
      相关资源
      最近更新 更多