0

NodeList オブジェクト (配列のような) で配列メソッドを実行するには、毎回 Array.prototype を間接的に呼び出す必要があります。

それが可能になるように何かできることnode_list.slice(0,1)はありますか?

NodeList は Object.prototype からメソッドを継承するため、以下のように実装し、完全に動作しますnode_list.slice(0,1)

Object.prototype.slice = function(a,b){ return Array.prototype.slice.call(this,a,b);}

Object.prototype にスライスを実装する際に不利な点はありますか?

Array.prototype を呼び出す従来の方法:

node_list
[<li>​ test_list1 ​&lt;/li>​, <li>​ test_list2 ​&lt;/li>​]

Object.prototype.toString.call(node_list)
"[object NodeList]"

var content = Array.prototype.slice.call(node_list,0,1)

content
[<li>​ test_list1 ​&lt;/li>​]

Object.prototype.toString.call(content)
"[object Array]"
4

1 に答える 1

2

このため、オブジェクトのプロトタイプを拡張することはお勧めできません。
組み込みのプロトタイプを拡張したい場合でも、拡張を必要な部分に減らします。

HTMLCollection
NodeList

ループに現れないプロトタイプ メソッドはfor(.. in ..)、次のように定義できます。

var slicer = { value: Array.prototype.slice };
Object.defineProperty(HTMLCollection.prototype, 'slice', slicer);
Object.defineProperty(NodeList.prototype, 'slice', slicer);

以下も参照してください。

最短の方法 (プロトタイプを拡張せずに)

// Equivalent to the question's code
[].slice.apply(node_list,0,1)
// A method to turn a node_list/HTMLCollection in an array (for later use?)
[].slice.call(node_list);
于 2012-04-08T15:55:24.970 に答える