原型在JavaScript中不好?
在Felix的Node.js风格指南中说:
不要扩展任何对象的原型,特别是原生的。 如果你不遵守这条规则,地狱里有一个特别的地方等着你。
这篇文章也让我质疑原型的使用。 如果你打算在代码中添加一个方法,为什么不把它添加到原来的构造函数中呢?
那么,什么时候需要扩展一个对象的原型呢?
不,原型不坏。 恰恰相反,JavaScript是一种原型语言,原型是你应该如何扩展对象。
这个引用是针对扩展Object.prototype
。 不是“一个对象的原型”。 JavaScript中的所有东西都是从Object
inheritance的,所以搞乱它的原型就影响了一切。 它打破for(var n in obj){
循环,只是烦人。
这是对原型的唯一的东西 – 他们出现在for-in循环。 除此之外,它们是BY FAR,是在JS中扩展对象的最佳方法。
至于为什么 – 在构造函数中添加对象,说:
function myClass(){ this.someMethod = function(){ ... } }
意味着你将有一个单独的function为每个类的实例。 通过原型做到这一点:
myClass.prototype.someMethod = function(){ ... }
意味着将只有该function的一个副本。 更高的内存效率,并允许对语言进行热编辑。 假设你想编辑String.prototype,例如:
String.prototype.trim = function(){ ... }
如果你刚刚添加到构造函数,现有的string不会有.trim()
方法,所以代码: navigator.userAgent.trim()
将无法正常工作,因为navigator.userAgent
是在添加trim()
方法之前定义的。
那篇文章只是提姆肛门和偏执。 忽略它:)只要你不忘记inputnew myClass()
而不是只是myClass()
,你将不会有任何问题。
不要扩展任何对象的原型,特别是原生的。
扩展本地对象时,比如string可能会成为一个问题,因为用户期望该对象有某些行为,但获得的结果不同。 他们可能很难debugging这个..