原型在JavaScript中不好?

Felix的Node.js风格指南中说:

不要扩展任何对象的原型,特别是原生的。 如果你不遵守这条规则,地狱里有一个特别的地方等着你。

这篇文章也让我质疑原型的使用。 如果你打算在代码中添加一个方法,为什么不把它添加到原来的构造函数中呢?

那么,什么时候需要扩展一个对象的原型呢?

不,原型不坏。 恰恰相反,JavaScript是一种原型语言,原型是你应该如何扩展对象。

这个引用是针对扩展Object.prototype 。 不是“一个对象的原型”。 JavaScript中的所有东西都是Objectinheritance的,所以搞乱它的原型就影响了一切。 它打破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这个..