我正在为should.js阅读readme
并进入“OMG IT EXTENDS OBJECT ???!?!@”部分,其中说
是的,是的,只有一个吸气剂
should
, 不,它不会破坏你的代码, 因为它使用非可枚举属性正确执行此操作。
我一直听说你不应该扩展object
原型,但从来没有真正理解为什么。
有人可以解释为什么,一般来说,扩展object
是不好的(它会破坏什么)?并解释了不可枚举的属性是什么以及它有何帮助?
答案 0 :(得分:1)
问题在于扩展Object.prototype
。如果扩展是可枚举的,那么在使用for-in
时,每个对象的每个枚举都会遇到它。
Object.prototype.foo = "bar";
var empty_object = {};
for (var p in empty_object) {
alert(p + " " + empty_object[p]);
}
显然,这可能会破坏您的代码。您可以在每个对象属性的每个枚举中使用.hasOwnProperty()
,但会对性能产生影响。有时候你实际上想要在你的枚举中包含继承的属性,但这使得它变得不可能,或者至少非常难以实现。
您还应该注意,仅仅因为该属性被标记为不可枚举,并不意味着它不会破坏您的代码。
如果您有一个对象,并且需要获取.should
属性的值(如果存在),该怎么办? (其中.should
预计代码中会有其他含义。)
var val = my_object.should;
if (val) {
// do something
} else {
// do something else
}
麻烦的是.should
属性现在总是会返回继承属性的值,如果my_object
上没有。{/ p>
此问题适用于原生Object.prototype
扩展程序,但至少这些名称是众所周知的,因此习惯性地避免使用。
图书馆记录这个扩展程序是件好事,但声称它不会破坏你的代码仍然是非常短视的。
他们能做的最少就是将其作为可选扩展名。