Расширение прототипа объекта
Имеется следующая функция:
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, время: 23:48. |