在Felix's Node.js Style Guide中说:
不要扩展任何原型 对象,尤其是原生对象。那里 在地狱等待的特殊地方 你,如果你不遵守这个规则。
This article也让我质疑原型的用途。如果您稍后要在代码中添加方法,为什么不将它添加到原始构造函数中?
那么,何时需要扩展对象的原型?
答案 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)
不要扩展任何原型 对象,特别是原生对象。
扩展本机对象时,例如字符串可能是一个问题,因为用户期望该对象有某些行为,但结果会有所不同。他们可能很难调试这个..