使用非可枚举属性扩展对象
我正在阅读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他们可以做的将是使其成为一个可选的扩展。