Javascript 添加到对象原型与简单函数

Javascript 添加到对象原型与简单函数,javascript,node.js,oop,prototype,Javascript,Node.js,Oop,Prototype,有趣的是,当我将一个方法添加到对象中并在我的对象中循环时,添加到原型中的方法成为关键之一。请参见以下示例: 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.

有趣的是,当我将一个方法添加到
对象中
并在我的对象中循环时,添加到原型中的方法成为关键之一。请参见以下示例:

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
}
var a={“foo”:“bar”};
Object.prototype.clean=function(){
}
var keys=对象。keys(a);
对于(变量i=0;i
但是由于我的项目中有很多对象,我不想改变我的简单循环
for(a中的var I)的行为{
。这是否意味着为了不看到这些奇怪的行为,我不应该将我的方法添加到prototype对象中?我应该将它作为一个简单的函数,而不是添加对象原型?

请使用该方法声明对象。prototype.clean with enumerable:false descriptor选项。它将阻止您的新方法迭代

Object.defineProperty(Object.prototype,'clean',{enumerable:false,value:function(){
  //FUNCTION CLEAN BODY
}})

您永远不应该扩展内置对象(如对象、字符串、数组)的原型,因为您无法确定另一个库是否因您的扩展而中断。为了确保处理此类陷阱,对对象的迭代应检查
hasOwnProperty

Object.keys()
创建一个自己属性的数组,所以这对此类扩展是安全的


使用时,它会告诉您第一个循环有什么问题。

使用
if(a.hasOwnProperty(i)){…}
使用
for in
循环来避免这个问题。我已经知道了只获取对象的真正关键字的解决方法;但是由于我有很多对象和很多循环,如果要使用
for in
循环非普通对象,我不想遍历每个循环并更改添加的原型的语法t是《Javascript:好的部分》一书中提出的正确范例。不想做更多的工作是不相关的;)那么这是否意味着我应该拥有独立的简单函数,而不是添加到对象的原型中?@Pasargad您意识到添加到对象的原型中实际上适用于所有对象(函数、数组、数字、字符串等),对吗?你真的想要吗?你添加的函数对所有的函数都是通用的吗?嗯,添加到对象的原型也会影响数字和字符串?严重吗?无论如何,不,我需要它只是为了对象,甚至不是数组。这是否意味着我需要有自己的独立简单函数?请不要这样做。唯一有效的情况是提供方法这些库被称为“shim”或“shiv”。你能想象一下当每个人都扩展内置类型的原型时会发生什么吗?