在 Felix's Node.js Style Guide它说:
Do not extend the prototypes of any objects, especially native ones. There is a special place in hell waiting for you if you don't obey this rule.
This article也让我质疑原型(prototype)的用途。如果您稍后要在代码中添加方法,为什么不直接在原始构造函数中添加呢?
那么,什么时候需要扩展对象的原型(prototype)?
最佳答案
不,原型(prototype)还不错。恰恰相反,JavaScript 是一种原型(prototype)语言,而原型(prototype)是您应该扩展对象的方式。
这句话是反对专门扩展 Object.prototype
的。不是“对象的原型(prototype)”。 JavaScript 中的 Everything 继承自 Object
,因此弄乱它的原型(prototype)会影响一切。它打破了 for(var n in obj){
循环,很烦人。
这是对原型(prototype)的唯一反对——它们出现在 for-in 循环中。除此之外,到目前为止,它们是在 JS 中扩展对象的最佳执行方式。
至于为什么——在构造函数中添加对象,说:
function myClass(){
this.someMethod = function(){ ... }
}
意味着你将为类的每个实例都有一个单独的函数。通过原型(prototype)实现:
myClass.prototype.someMethod = function(){ ... }
表示该函数只会有一个副本。内存效率更高,并允许对语言进行热编辑。假设您要编辑 String.prototype,例如:
String.prototype.trim = function(){ ... }
如果你只是以某种方式将它添加到构造函数中,现有字符串将没有 .trim()
方法,因此代码:navigator.userAgent.trim()
将不起作用,因为在添加 trim()
方法之前定义了 navigator.userAgent
。
那篇文章只是蒂姆的肛门和偏执狂。忽略它 :) 只要你不忘记键入 new myClass()
而不仅仅是 myClass()
,你就不会有任何问题。
关于javascript - JavaScript 中的原型(prototype)不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5575478/