每位JS意见领袖都说,扩展本机对象是一种不良做法。但为什么?我们会获得出色的表现吗?他们是否担心有人会以“错误的方式”这样做,并向中添加可枚举的类型Object,实际上破坏了任何对象上的所有循环?
以TJ Holowaychuk的should.js为例。他向其中添加了一个简单的吸气剂,Object并且一切正常(源代码)。
Object.defineProperty(Object.prototype, 'should', { set: function(){}, get: function(){ return new Assertion(Object(this).valueOf()); }, configurable: true });
这真的很有意义。例如,可以扩展Array。
Array
Array.defineProperty(Array.prototype, "remove", { set: function(){}, get: function(){ return removeArrayElement.bind(this); } }); var arr = [0, 1, 2, 3, 4]; arr.remove(3);
是否有反对扩展本机类型的论点?
扩展对象时,将更改其行为。
更改仅由您自己的代码使用的对象的行为就可以了。但是,当您更改其他代码也使用的某些行为时,就有可能破坏该其他代码。
当将方法添加到javascript中的对象和数组类中时,由于javascript的工作原理,发生破坏的风险很高。多年的经验告诉我,这类东西会导致javascript中各种可怕的错误。
如果需要自定义行为,最好定义自己的类(也许是子类),而不是更改本机类。这样,您将不会破坏任何东西。
更改类的工作方式而不将其子类化的能力是任何好的编程语言的一项重要功能,但这是很少使用且必须谨慎使用的语言。