原型在JavaScript中是不是很糟糕?

时间:2011-04-07 03:06:58

标签: javascript node.js prototype-programming

Felix's Node.js Style Guide中说:

  

不要扩展任何原型   对象,尤其是原生对象。那里   在地狱等待的特殊地方   你,如果你不遵守这个规则。

This article也让我质疑原型的用途。如果您稍后要在代码中添加方法,为什么不将它添加到原始构造函数中?

那么,何时需要扩展对象的原型?

2 个答案:

答案 0 :(得分:34)

不,原型也不错。恰恰相反,JavaScript是一种原型语言,原型就是假设扩展对象的方式。

引用反对特别延长Object.prototype。不是“对象的原型”。 JavaScript中的 Everything 继承自Object,所以搞乱其原型会影响一切。它打破了for(var n in obj){循环并且很烦人。

这是唯一反对原型的东西 - 它们出现在for-in循环中。除此之外,它们是BY FAR,是在JS中扩展对象的最佳表现方式。

至于为什么 - 在构造函数中添加对象,比如说:

function myClass(){
    this.someMethod = function(){ ... }
}

表示您将为该类的每个实例提供单独的函数。通过原型来实现:

myClass.prototype.someMethod = function(){ ... }

表示只有该功能的一个副本。更高效的内存,并允许热门编辑语言。假设您要编辑String.prototype,例如:

String.prototype.trim = function(){ ... }

如果您刚刚以某种方式将其添加到构造函数中,则现有字符串将不具有.trim()方法,因此代码:navigator.userAgent.trim()将无效,因为在您添加之前已定义navigator.userAgent trim()方法。

那篇文章只是蒂姆肛门和偏执狂。忽略它:)只要你不忘记输入new myClass()而不是myClass(),你就不会有任何问题。

答案 1 :(得分:2)

  

不要扩展任何原型   对象,特别是原生对象。

扩展本机对象时,例如字符串可能是一个问题,因为用户期望该对象有某些行为,但结果会有所不同。他们可能很难调试这个..

相关问题