添加到Object prototype Vs的简单功能

时间:2015-09-22 20:20:46

标签: javascript node.js oop prototype

有趣的是,当我向Object添加方法并遍历我的对象时,添加到原型的方法成为关键之一。请参阅以下示例:

var a = {"foo":"bar"};
Object.prototype.clean= function() {
}

for(var i in a){
    console.log("i:", i);// logs foo,clean
}

这就是问题;我不想要这种行为;我提出了以下解决方法:

var a = {"foo":"bar"};
Object.prototype.clean= function() {
}

var keys= Object.keys(a);
for(var i=0; i < keys.length; i++){
    console.log("i", i); //now it just logs foo
}

但是由于我的项目中有很多对象,所以我不想改变简单循环for(var i in a){的行为。这是否意味着我不应该将我的方法添加到原型对象中,以免看到这些奇怪的行为?我应该把它作为一个简单的函数而不是添加Object原型?

2 个答案:

答案 0 :(得分:0)

请使用defineProperty方法使用enumerable:false描述符选项声明Object.prototype.clean。它会阻止你的新方法迭代。

{{1}}

答案 1 :(得分:0)

您永远不应该扩展内置对象的原型(如Object,String,Array),因为您无法确定其他库是否因您的扩展而中断。并且为了确保处理这种陷阱,迭代对象应该检查 (11 17 19 23 29 35 39 41 47)

hasOwnProperty创建了一个自己的属性数组,因此这对这种扩展是安全的。

使用jshint时,它会告诉你第一个循环出了什么问题。