2011-07-06 23 views
3

私は方法で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 
+0

プッシュ/ポップなどはどうですか?インスタンスにプロトタイプを割り当てていますが、Array型ではありません。 –

答えて

3

prototypeArrayように、コンストラクタ関数の特性です。したがって、Array.prototypeは存在しますが、[1, 2, 3].prototypeは存在しません。 Arrayはコンストラクタ関数であり、[1, 2, 3]は配列です。

Object.getPrototypeOfECMAScript 5 methodであり、すべてのブラウザに存在するわけではありません。その場合は、__proto__のプロパティ([1, 2, 3].__proto__)にアクセスすることができます。これは古くて非標準的なもので、Object.getPrototypeOfが新しい標準バージョンです。an ES5 shimを使用してがサポートされている場合はObject.getPrototypeOfとなります。

+0

私の更新を見て... – fredoverflow

+0

+1元の質問への答え – Davy8

2

DOMノードリストで作業しているようですが、これはJavaScript配列オブジェクトと同じではありません。

http://blog.duruk.net/2011/06/19/nodelists-and-arrays-in-javascript/は、いくつかの洞察を提供する必要があります。

ようなので、.slice方法を使用して、(例えばNodeList又はarguments変数として)アレイのようなオブジェクトから「本当の」javascript配列を得るために別の答えのように、

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

そして、はい示されている - .prototypeオブジェクトは、インスタンスではなくコンストラクタ関数のプロパティにすぎません。例えば。 Object.prototypeが存在しますが、({}).prototypeは未定義です。

+2

+1は、実際のタイプ( 'NodeList')へのリンクを見つけるのを打つためです。編集は全く異なる質問なので、OPは新しい質問をしたはずです。 – Davy8

+0

'slice'は少なくとも1つのパラメータを期待していません。これは' 0'でしょうか? – fredoverflow

+0

待って、私はステップを保存することができます: 'Array.prototype.filter.call(someDomElement.childNodes)' :) – fredoverflow

関連する問題