Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Расширение прототипа объекта (https://javascript.ru/forum/misc/17642-rasshirenie-prototipa-obekta.html)

DreamTheater 27.05.2011 15:13

Расширение прототипа объекта
 
Имеется следующая функция:

Object.prototype.toArray = function() {

  var array = [];

  for (var key in this) {

    array.push(this[key]);

  }

  return array.slice(0, -1);

}


Как видите, последним действием я выбрасываю последний элемент, потому что туда попадает прототип. Есть ли более корректные пути реализации данной функции?

И второй вопрос:

for (var key in object) {

  // do something

}


Все замечательно работает, у всех объектов появился новый метод, однако если я работаю в цикле, то перебираются все элементы объекта + метод toArray, который по идее должен находиться в прототипе. Почему это происходит и как этого избежать?

monolithed 27.05.2011 15:48

Object.prototype.toArray = function() {
  var array = [];
  for (var i in this) {
      if(this.hasOwnProperty(i)) {
        array.push(this[i]);
      }
  }
  return array;
}

alert({foo : 1, bar : 2}.toArray());

DreamTheater 27.05.2011 15:58

monolithed, спасибо, с первым пунктом разобрался, все отлично, но второй вопрос актуален. Когда в цикле перебирается объект, то свойства и методы прототипа обычно не учитываются, а в моем случае в цикл попадает метод toArray. Очень не хочется в кучу циклов по всему коду вписывать еще какие-то дополнительные проверки.

Kolyaj 27.05.2011 16:03

Потому что не надо ничего пихать в Object.prototype.

Sweet 27.05.2011 16:22

Меня безмерно радуют новые методы массива, поэтому эту задачу я бы решил так (Внимание! Некроссбраузерно!):
function toArray(object){
  return Object.keys( object ).map(function(key){
    return object[ key ];
  });
};

alert( toArray({foo : 1, bar : 2}) );
А прототип объекта действительно лучше не расширять: себе же капкан ставишь...

Kolyaj 27.05.2011 16:57

Object.keys как раз можно добавить туда, где его нет.

DreamTheater 27.05.2011 17:19

Убрал метод из прототипа, использую локально, проблем нет. Всем спасибо :)

nikita.mmf 27.05.2011 18:44

Цитата:

Сообщение от DreamTheater
Все замечательно работает, у всех объектов появился новый метод, однако если я работаю в цикле, то перебираются все элементы объекта + метод toArray, который по идее должен находиться в прототипе. Почему это происходит и как этого избежать?

Потому что на этом основа объектная модель языка, перебираются свойсва, его прототипа и родительских прототипов, для того чтобы, выбирать только свойства объекта, нужно делать так:
for ( var prop in obj ) {
    if ( obj.hasOwnProperty(prop) ) {
        //do something
    }
}


Часовой пояс GMT +3, время: 10:51.