Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.05.2011, 15:13
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

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

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, который по идее должен находиться в прототипе. Почему это происходит и как этого избежать?

Последний раз редактировалось DreamTheater, 27.05.2011 в 15:23.
Ответить с цитированием
  #2 (permalink)  
Старый 27.05.2011, 15:48
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

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());
Ответить с цитированием
  #3 (permalink)  
Старый 27.05.2011, 15:58
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

monolithed, спасибо, с первым пунктом разобрался, все отлично, но второй вопрос актуален. Когда в цикле перебирается объект, то свойства и методы прототипа обычно не учитываются, а в моем случае в цикл попадает метод toArray. Очень не хочется в кучу циклов по всему коду вписывать еще какие-то дополнительные проверки.
Ответить с цитированием
  #4 (permalink)  
Старый 27.05.2011, 16:03
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Потому что не надо ничего пихать в Object.prototype.
Ответить с цитированием
  #5 (permalink)  
Старый 27.05.2011, 16:22
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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

alert( toArray({foo : 1, bar : 2}) );
А прототип объекта действительно лучше не расширять: себе же капкан ставишь...
Ответить с цитированием
  #6 (permalink)  
Старый 27.05.2011, 16:57
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Object.keys как раз можно добавить туда, где его нет.
Ответить с цитированием
  #7 (permalink)  
Старый 27.05.2011, 17:19
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Убрал метод из прототипа, использую локально, проблем нет. Всем спасибо
Ответить с цитированием
  #8 (permalink)  
Старый 27.05.2011, 18:44
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прямая от первого объекта до второго ntro123 Events/DOM/Window 5 09.05.2011 08:41
импорт объекта в текущий скоп LedVisel Общие вопросы Javascript 4 06.06.2010 00:31
Как по событию вызвать метод определенного экземпляра объекта jvs jQuery 3 24.12.2009 16:04
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00
Не работает перебор свойств объекта BANick Общие вопросы Javascript 1 16.09.2008 22:46