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

标签 javascript node.js should.js

我正在阅读readme对于 should.js并进入“OMG IT EXTENDS OBJECT???!?!@”部分,上面写着

Yes, yes it does, with a single getter should, and no it won't break your code, because it does this properly with a non-enumerable property.

我一直听说您不应该延长 object原型(prototype)但从未真正理解为什么。

有人可以解释一下为什么一般来说要扩展 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
}

问题在于,如果 my_object 上没有直接继承的属性,那么 .should 属性现在将始终返回继承属性的值。

native Object.prototype 扩展存在此问题,但至少这些名称是众所周知的,因此通常会避免。

<小时/>

该库记录了此扩展,这很好,但声称它不会破坏您的代码仍然是非常短视的。

他们至少可以将其设为可选扩展。

关于javascript - 使用不可枚举属性扩展对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17002916/

相关文章:

javascript - raphael svg 路径的一部分卡在原地

javascript - Superagent 'request' 对象被重新定义为函数?

javascript - res.should.have.status 给我错误

javascript - 盒子自动从左向右滑动

javascript - ajax 请求后我的函数调用无法正常工作,仅在页面刷新后工作

javascript - 使用 JavaScript 按公共(public)值对对象属性进行分组

javascript - 如何使用 mocha 和 should.js 与 sails.js 编写二进制下载测试?

node.js - 在 mongoDB 中查询以获取具有不同值和最后添加的记录

javascript - javascript回调和匿名函数的范围是什么?

arrays - Node 推送变量动态