使用不可枚举的属性扩展对象

时间:2013-06-08 19:12:30

标签: javascript node.js should.js

我正在为should.js阅读readme并进入“OMG IT EXTENDS OBJECT ???!?!@”部分,其中说

  
    

是的,是的,只有一个吸气剂should,     不,它不会破坏你的代码,     因为它使用非可枚举属性正确执行此操作。

  

我一直听说你不应该扩展object原型,但从来没有真正理解为什么。

有人可以解释为什么,一般来说,扩展object是不好的(它会破坏什么)?并解释了不可枚举的属性是什么以及它有何帮助?

1 个答案:

答案 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扩展程序,但至少这些名称是众所周知的,因此习惯性地避免使用。


图书馆记录这个扩展程序是件好事,但声称它不会破坏你的代码仍然是非常短视的。

他们能做的最少就是将其作为可选扩展名。