使用非可枚举属性扩展对象

我正在阅读should.js的readme ,并获得了“OMG IT EXTENDS OBJECT ???!?!@”部分的内容

是的,是的,它只是一个单一的getter,不会破坏你的代码,因为它用一个非枚举属性正确地做了这个。

我一直听说你不应该扩展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() ,但是会对性能产生影响。 有时候你也在枚举中包含inheritance的属性,但是这使得它不可能,或者至less非常困难。


你也应该注意到,只是因为该属性被标记为不可枚举的, 这并不意味着它不会破坏你的代码

如果你有一个对象,而且你需要得到.should属性的值(如果存在的话)? .should中应该有其他含义。)

 var val = my_object.should; if (val) { // do something } else { // do something else } 

麻烦的是.should属性现在总是返回inheritance的属性的值,如果没有一个直接在my_object

这个问题存在于原生的Object.prototype扩展中,但是至less这些名字通常是已知的,因此习惯性的避免。


图书馆logging了这个扩展名是很好的,但是声称它不会破坏你的代码还是很短视的。

至less他们可以做的将是使其成为一个可选的扩展。