У массивов нет прототипа по умолчанию? - PullRequest
3 голосов
/ 07 июля 2011

Я надеялся, что смогу увеличить Array.prototype с помощью методов, а затем вызвать их для любого массива:

>>> [1, 2, 3].customMethod();

Но, похоже, у массивов нет прототипа ...?

>>> [1, 2, 3].prototype
undefined

Я что-то здесь упускаю?


Похоже, моя настоящая проблема заключается в другом: вызов [1, 2, 3].customMethod() работает, но вызов someDomElement.childNodes.customMethod() завершается неудачно childNodes не является реальным массивом?

childNodes.filter is not a function

Ответы [ 2 ]

3 голосов
/ 07 июля 2011

prototype - это свойство функций конструктора, например Array.Итак, Array.prototype существует, но не [1, 2, 3].prototype;Array - это функция конструктора, а [1, 2, 3] - массив.

Вы ищете Object.getPrototypeOf([1, 2, 3]).

Object.getPrototypeOf - это ECMAScript 5 метод и как таковой может присутствовать не во всех браузерах.В этом случае вы можете попробовать получить доступ к свойству __proto__, то есть [1, 2, 3].__proto__, которое является более старой нестандартной вещью, для которого Object.getPrototypeOf является новой стандартной версией, или вы можете использовать шайбу ES5 чтобы убедиться, что везде, где поддерживается __proto__, также Object.getPrototypeOf.

2 голосов
/ 07 июля 2011

Похоже, вы работаете с DOM NodeList, который отличается от объекта массива JavaScript.

http://blog.duruk.net/2011/06/19/nodelists-and-arrays-in-javascript/ должны дать некоторое представление.

Чтобы получить «настоящий» массив javascript из объекта, похожего на массив (например, переменную NodeList или arguments), используйте метод .slice, например, так:

var realArray = Array.prototype.slice.call(someDomElement.childNodes);
realArray.filter()

И да, как и в другом ответе, указанном - объект .prototype является только свойством функции конструктора, а не экземпляров. например. Object.prototype существует, но ({}).prototype не определено.

...