【问题标题】:Why would using new and constuctor functions in JavaScript be wrong [duplicate]为什么在 JavaScript 中使用 new 和构造函数是错误的 [重复]
【发布时间】:2014-03-07 07:47:04
【问题描述】:

我在 SO 问题中看到了一些文章和一些关于使用 new 和构造函数是错误的并且不应该使用的答案的声明。

它们违背了 JavaScript 的原型特性。

有人可以启发我并展示使用new 和构造函数的情况非常糟糕,不应该使用吗?

【问题讨论】:

  • new 只是程序员包里的另一个工具——不要害怕在相关的地方使用它们。 evalwith 等其他事物也是如此(尽管后者的情况很少见)。
  • 你能链接到那些文章吗?
  • Object.create 之前,如果需要原型支持,确实没有替代new 的机会。
  • @user2864740——MDN 上有一个用于 Object.create 的 pollyfill,它使用了至少十年前创建的模式(最初称为“克隆”)。还有直接分配给__proto__(在某些浏览器中),但已被其他方法取代。
  • @RobG polyfill 需要 new__proto__ 从未被远程标准化。

标签: javascript oop prototype


【解决方案1】:

使用new和constructor函数是错误的,不应该使用。

阅读Is JavaScript's "new" keyword considered harmful? - ,不是。一些(正确的)论点是

  • 由于隐藏了原型概念,新手会感到困惑。引用@Aadit

    [使用new] 构造函数变得更简单。然而它变得非常 很难向知道的人解释原型继承 没什么。向一个人解释它变得更加困难 知道经典继承的人。

  • 构造函数在忘记new 时会默默地失败
  • 在少数情况下,Object.create 方法更简洁
  • 构建类层次结构很复杂,often done wrong

然而,一旦你理解了这些,new 是无害的。实际上,每次您需要实例初始化和原型继承时,使用 new 的构造函数都是可行的方法。

它们违背了 JavaScript 的原型特性。

这永远不会改变。我很难想象为什么有人会批评这一点,原型继承比类继承强大得多。可能他们只是在反对语法。

有人可以启发我并展示一个使用 new 和构造函数的情况非常糟糕,不应该使用吗?

不应该在不需要的时候使用。可以使用模块模式和对象字面量轻松创建单例;继承在这里没有帮助。示例见Is it right to think of a Javascript Function Expression that uses the 'new' keyword as 'static'

【讨论】:

  • 但是可以使用new 没有继承可以这么说;并使用原型“保存属性”(尽管可能不是现代 JS 实现的有效参数)。
  • @user2864740: 不。new 总是使用自定义继承链创建一个新对象 - 或者你的意思是 new Object 通过“没有继承”?
  • 谢谢您,Bergi,很抱歉在这里发布此内容,但最近出现的答案是指文章或直接建议不要使用 new。也许我错过了一些新的开发,应该建议询问原型信息的用户不要使用新的,但我不这么认为。包括我对这些陈述的问题在内的问题已关闭stackoverflow.com/questions/21669415/…
  • @Bergi 以下答案 stackoverflow.com/a/21654362/1641941 解决了 OP 的问题(在评论中给出了更正),然后继续使用“帮助”函数,其好处是“您不必了解原型使用它”并有一个链接到该文章的链接,该链接会告诉您使用 new 是不好的(两次)首先评论您的答案stackoverflow.com/a/21609992/1641941 DC 文章的链接令人困惑,但提出了几个声称“经典继承”不好和链接关于 DC 如何使用它,我确实评论说使用的代码确实不好,但不是这样做的方法
  • @HMR: 啊,你指的是aaditmshah.github.io/why-prototypal-inheritance-matters/…——你可以直接指向那里:-) 实际上我认为他是对的。一切都是为了理解它是如何工作的——new 对学习者没有帮助。但是,对于大师来说,它是一个强大的工具。因此,您可以从中得出自己的结论——您(和您的团队)准备好使用它了吗?
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 2022-01-06
  • 1970-01-01
  • 2018-05-28
  • 2021-02-06
相关资源
最近更新 更多