【问题标题】:Which of these prototype declarations is better and why? [duplicate]这些原型声明中哪个更好,为什么? [复制]
【发布时间】:2014-04-14 00:17:37
【问题描述】:

我正在尝试决定如何在我的主库的原型中设置我的函数。

我应该使用:

Library.prototype.funcA = function () {.....};
Library.prototype.fucnB = function () {.....};
etc..

Library.prototype = {
    funcA: function () {.....},
    funcB: function () {.....},
    etc..
};

所以基本上第一选择将我所有的功能添加到原型中。第二个选项用包含我所有函数的对象替换原型。有关系吗?

【问题讨论】:

  • var foo = new Library(); Library.prototype = {bar: function(){ alert(1); }}; foo.bar();
  • 如果您采用第二种方法,请不要忘记在后面添加contructorLibrary.prototype = {.... , constructor: Library};。没必要,但如果设置不正确会很奇怪。

标签: javascript function prototype


【解决方案1】:

在这种情况下,不,没关系。它是您的对象,您不会尝试从任何东西继承,因此覆盖原型(而不是附加到它)并不重要。

在一般情况下,是的,这可能很重要。您正在破坏对象可用的任何现有原型方法。除非您非常确定您的代码拥有相关对象,否则您不应该这样做。相反,将方法附加到原型也需要思考;其他对象可能与您正在修改其原型的对象共享一个原型。

【讨论】:

  • OP 已经知道.prototype = 覆盖了现有的原型。见问题。
【解决方案2】:

如果Library 具有您不想丢失的原型属性/方法,您可能希望通过扩充已经存在的原型来添加它们。否则,这真的取决于个人喜好。我喜欢第二种方法,因为它看起来更干净,但我在代码中都使用了这两种方法。

【讨论】:

    【解决方案3】:

    我会选择第一个选项。

    您不想完全替换原型,因为您永远不知道从另一个项目中添加了什么。

    如果它是完全独立的,只有你在做的事情,第二个是一个不错的选择。但这仍然不是一个好习惯,因此您不会无意中破坏了其他人所依赖的某些功能。

    【讨论】:

    • 奇怪的是,我觉得这是所有给定答案中最好的答案,尤其是原型覆盖部分。
    • 在阅读了所有答案和对其他帖子的引用后,我同意这是最好的答案。仅仅为了添加我的功能而破坏原型链或从原型中删除所有内容是没有意义的。我可以看到任何一个都有效,但我认为保留原始原型并添加它会更优雅。谢谢。
    【解决方案4】:

    这很重要。您必须注意 prototype 是一个对象。所以你的陈述“第二个选项用一个包含我所有功能的对象替换原型。”是错误的。它只是重置原型对象。

    所以使用:

    Library.prototype = {
        funcA: function () {.....},
        funcB: function () {.....},
        etc..
    };
    

    更快,但是你删除了在分配之前的每个原型函数:

    Library.prototype.funcA
    

    正在添加属性。

    因此,如果您必须添加一个属性(而不是删除一个),请使用:

    Library.prototype.funcA
    

    否则,分配一个对象。

    【讨论】:

    • 请告诉我这个答案有什么问题?
    • 有人投反对票。
    • 你们更改帖子的速度如此之快,以至于无法跟上它们:) +1,因为部队的平衡很重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 2015-12-30
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多