我正在阅读readme
for should.js并进入“OMG IT EXTENDS OBJECT???!?!@”部分,上面写着
是的,是的,只有一个 getter
should
,它不会破坏你的代码,因为它使用不可枚举的属性正确地做到了这一点。
我一直听说你不应该扩展object
原型,但从来没有真正理解为什么。
有人可以解释为什么一般来说扩展object
是不好的(它会破坏什么)?并解释什么是不可枚举属性以及这有什么帮助?
我正在阅读readme
for should.js并进入“OMG IT EXTENDS OBJECT???!?!@”部分,上面写着
是的,是的,只有一个 getter
should
,它不会破坏你的代码,因为它使用不可枚举的属性正确地做到了这一点。
我一直听说你不应该扩展object
原型,但从来没有真正理解为什么。
有人可以解释为什么一般来说扩展object
是不好的(它会破坏什么)?并解释什么是不可枚举属性以及这有什么帮助?
问题在于扩展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
如果没有直接 on ,该属性现在将始终返回继承属性的值my_object
。
本机Object.prototype
扩展存在此问题,但至少这些名称是众所周知的,因此习惯性地避免使用。
图书馆记录了这个扩展很好,但声称它不会破坏你的代码仍然是非常短视的。
他们至少能做的就是让它成为一个可选的扩展。