Javascript 防止对象中键的新原型方法出现在for循环中

Javascript 防止对象中键的新原型方法出现在for循环中,javascript,Javascript,我有一个函数,我想让它对所有对象都可用。 它是如下定义的mergeObject(object)函数: Object.prototype.mergeObjects = function(object){ if (typeof object != "object") return; for(var key in object){ if (object.hasOwnProperty(key)) this[key] = object[key];

我有一个函数,我想让它对所有对象都可用。 它是如下定义的mergeObject(object)函数:

Object.prototype.mergeObjects = function(object){
    if (typeof object != "object") return;
    for(var key in object){
        if (object.hasOwnProperty(key))
            this[key] = object[key];
    }
    return this;
}
我有一个可变事件,它是:

events : {
    "click #retryBtn":"onRetryBtnClick",
    "click #cancelBtn":"onCancelBtnClick",
    "click .dialogButton":"onDialogBtnClick"
}
这是主干的事件json对象

当我尝试为事件中的键运行for循环时

for (var key in events) 
{
    console.log(key) 
}
它打印出来了

click #retryBtn
click #cancelBtn
click .dialogButton
mergeObjects
我不明白为什么我把“mergeObjects”作为“events”对象中的键

事件对象的结构是:

click #cancelBtn: "onCancelBtnClick"
click #retryBtn: "onRetryBtnClick"
click .dialogButton: "onDialogBtnClick"
__proto__: Object
    __defineGetter__: function __defineGetter__() { [native code] }
    __defineSetter__: function __defineSetter__() { [native code] }
    __lookupGetter__: function __lookupGetter__() { [native code] }
    __lookupSetter__: function __lookupSetter__() { [native code] }
    constructor: function Object() { [native code] }
    hasOwnProperty: function hasOwnProperty() { [native code] }
    isPrototypeOf: function isPrototypeOf() { [native code] }
    mergeObjects: function (object){                 
    propertyIsEnumerable: function propertyIsEnumerable() { [native code] }
    toLocaleString: function toLocaleString() { [native code] }
    toString: function toString() { [native code] }
    valueOf: function valueOf() { [native code] }
    get __proto__: function __proto__() { [native code] }
    set __proto__: function __proto__() { [native code] }
有人能解释为什么“mergeObject”是for循环键的一部分吗


我怎样才能避免呢?因为还有其他方法,如“定义器”,它们不会出现在for循环键中。

使用
hasOwnProperty
跳过继承的属性:

for (var key in events) 
{
    if (events.hasOwnProperty(key)) {
        console.log(key);
    }
}

mergeObjects
是可枚举属性(意味着可以使用for in访问它),它由
事件
对象继承,而像
\u defineGetter
这样的方法是不可枚举的(for in无法访问)

循环遍历对象的所有可枚举属性,包括原型链中的属性

用于避免继承属性并仅获取直接可枚举属性

for (var key in events) 
{
    if(events.hasOwnProperty(key))
    console.log(key) 
}
如果希望对象的所有直接属性都是可枚举的或不可枚举的(使用with ENUMABLE false设置),那么应该像这样迭代(IE9+)


在IE9及以上版本中,它可以向
对象添加方法。prototype
很少是一个好主意,因为它对对象作为字典的使用不感兴趣。只是不要在
对象上添加方法。prototype
是的,我可以在我的代码中这样做。但有一个问题:上面的for循环只是一个例子。这样一个for循环存在于主干框架中,它遍历events对象中的键,这就是我的代码崩溃的地方。我不能改变它。所以基本上for循环不在我手中。我想用我的方法做点什么,防止它出现在循环中。。请给我另一个解决方案。然后使用
对象将您的方法定义为不可枚举。defineProperty
是的,我可以在代码中这样做。但有一个问题:上面的for循环只是一个例子。这样一个for循环存在于主干框架中,它遍历events对象中的键,这就是我的代码崩溃的地方。我不能改变它。所以基本上for循环不在我手中。我想用我的方法做点什么,防止它出现在循环中。。请给我另一个解决方案我很惊讶在流行框架中循环对象的代码还没有做到这一点。
var keys = events.getOwnPropertyNames(); 
for(var i=0;i<keys.length;i++)
{
    console.log(keys[i]) 
}
/*
Or using forEach
events.getOwnPropertyNames().forEach(function(key){
    console.log(key);
})
*/    
Object.defineProperty(Object.prototype, 'mergeObjects', {
  value: function(object){
             if (typeof object != "object") return;
                 for(var key in object){
                    if (object.hasOwnProperty(key))
                        this[key] = object[key];
                 }
             return this;
   },
   enumerable:false  //no need for this statement as default is false
});