首页 > 解决方案 > 当扩展 Obect.prototype 然后在一个 istance 上使用 for in 时,js 也会遍历原型

问题描述

我将此方法添加到对象原型中:

if( !Object.prototype.forEach ) {
    Object.prototype.add({
       'forEach': function(fn) {
            var object = this, ret;

            Object.keys(object).forEach(function(key) {
                if (ret === false)
                    return;

                ret = fn.call(null, object[key], key, object);
            });

            return object;
        }
    });
}

然后这样做:

 switch( typeOf( arguments[0] ) ) {
     case 'string':
         // ...

     case 'object':
         var prop;
         for(prop in arguments[0]) {
             // ...
         }

并且代码也在迭代forEach。如果arguments[0]{a: 'a', b: 'b'},它会遍历a,b,forEach。我该如何解决这个问题?

先感谢您。

标签: javascriptobjectprototype

解决方案


添加到Object.prototype. 发生冲突的机会太大了。您可以使用恰好使用您添加的属性名称作为标记的库,如果它存在于给定对象上则做一件事,但如果它不存在则做其他事情。(ES2015 实际上必须添加一种全新的属性名称 [ Symbol] 以使内置操作具有类似的逻辑 [例如,用于获取迭代器和类似的]。)

但是,如果您仍然这样做,请确保您添加的属性是不可枚举的,方法是使用Object.defineProperty

Object.defineProperty(Object.prototype, "forEach", {
    value: function() { /*...*/ },
    enumerable: false // This is actually the default, just here for emphasis
});

我建议无论您在哪里获得该Object.prototype.add功能,都可能不是学习的地方。


推荐阅读