Resident234
@Resident234
Back-End . PHP . Bitrix

JS. Странности с prototype?

Добрый день.
Имеется функция
Array.prototype.UContainsCustom = function(closure)
{
    var i, pLen = this.length;
    for (i = 0; i < pLen; i++)
    {
        if (closure(this[i])) { return i; }
    }
    return -1;
}

проблема в том, что из-за этой функции возникают странности в цикле:
console.log(currentOffer.IMAGES);
                for (i in currentOffer.IMAGES) {
                    img = currentOffer.IMAGES[i];
                    console.log(img);
                    
                }

первый console.log показывает
0: "/upload/iblock/0b2/0b223b35e0910f3adb978064abeb335c.jpg"
1: "/upload/iblock/5b7/5b7dfa007d387fab8cca969ca14cdc42.jpg"

тут всё ок.
второй console.log показывает уже показывает странность:
/upload/iblock/0b2/0b223b35e0910f3adb978064abeb335c.jpg
/upload/iblock/5b7/5b7dfa007d387fab8cca969ca14cdc42.jpg
function(closure)
{
    var i, pLen = this.length;
    for (i = 0; i < pLen; i++)
    {
        if (closure(this[i])) { return i; }
    }
    return -1;
}
т.е. на третьей итерации, которой быть не должно, выводится код этой функции.
Как это можно объяснить ?
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
В языке JavaScript свойства объектов могут быть перечисляемыми или неперечисляемыми ...
Перечисляемые свойства участвуют в итерации в цикле for...in ...

https://developer.mozilla.org/ru/docs/Web/JavaScri...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
for (i in currentOffer.IMAGES) {
  if (!currentOffer.IMAGES.hasOwnProperty(i)) continue; // magic here =))
  img = currentOffer.IMAGES[i];
  console.log(img);
}
Ответ написан
Комментировать
mlnkv
@mlnkv
JavaScript Developer
Странности не с ptototype, а с изучением особенностей языка
Расширять прототип встроенных классов (Array, Object, String etc.) считается плохой практикой (говнокодом), но если уж очень надо, то надо устанавливать для новых свойств объекта прототипа флаг enumerable = false
Object.defineProperty(Array.prototype, 'UContainsCustom ', {
  value: function(closure) {
    var i, pLen = this.length;
    for (i = 0; i < pLen; i++) {
        if (closure(this[i])) return i;
    }
    return -1;
  }
});


https://developer.mozilla.org/ru/docs/Web/JavaScri...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы