每个 JS 意见领袖都说扩展 native 对象是一种不好的做法。但为什么?我们的表现会受到影响吗?他们是否担心有人“以错误的方式”这样做,并向 Object
添加可枚举类型,实际上破坏了任何对象上的所有循环?
取TJ Holowaychuk的 should.js例如。他adds a simple getter到 Object
并且一切正常(source)。
Object.defineProperty(Object.prototype, 'should', {
set: function(){},
get: function(){
return new Assertion(Object(this).valueOf());
},
configurable: true
});
这真的很有道理。例如,可以扩展 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 中出现各种可怕的错误。
如果您需要自定义行为,最好定义自己的类(也许是子类)而不是更改 native 类。这样你就不会破坏任何东西。
能够在不创建子类的情况下改变类的工作方式是任何优秀编程语言的重要特征,但必须很少使用并谨慎使用。
关于javascript - 为什么扩展 native 对象是一种不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14034180/