При расширении Obect.prototype и последующем использовании for in istance js выполняет итерации и через прототип - PullRequest
0 голосов
/ 12 июня 2018

Я добавляю этот метод к прототипу объекта:

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.Как я могу решить это?

Заранее спасибо.

1 Ответ

0 голосов
/ 12 июня 2018

Это очень плохая идея, когда-либо добавлять к 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 функция, вероятно, не место для обучения.

...