Расширение прототипа объекта
Имеется следующая функция:
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, который по идее должен находиться в прототипе. Почему это происходит и как этого избежать? |
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()); |
monolithed, спасибо, с первым пунктом разобрался, все отлично, но второй вопрос актуален. Когда в цикле перебирается объект, то свойства и методы прототипа обычно не учитываются, а в моем случае в цикл попадает метод toArray. Очень не хочется в кучу циклов по всему коду вписывать еще какие-то дополнительные проверки.
|
Потому что не надо ничего пихать в Object.prototype.
|
Меня безмерно радуют новые методы массива, поэтому эту задачу я бы решил так (Внимание! Некроссбраузерно!):
function toArray(object){ return Object.keys( object ).map(function(key){ return object[ key ]; }); }; alert( toArray({foo : 1, bar : 2}) );А прототип объекта действительно лучше не расширять: себе же капкан ставишь... |
Object.keys как раз можно добавить туда, где его нет.
|
Убрал метод из прототипа, использую локально, проблем нет. Всем спасибо :)
|
Цитата:
for ( var prop in obj ) { if ( obj.hasOwnProperty(prop) ) { //do something } } |
Часовой пояс GMT +3, время: 10:51. |