質問: document.getElementsByTagName('li'); この時のvar listsは "配列ではなく、lengthを持っている HTMLCollection であって配列用のメソッドは使えない" と言われてます。 まず、HTMLCollectionというのは配列とは異なったオブジェクトなんですよね...。 そしてcallメソッドとは例えば以下のような場合 Array.prototype.slice.call(lists,0); Arrayオブジェクトの中で宣言されてるthisがvar listsに置き換わるイメージでしょうか。 ちょっとかなり混乱しながら書いてて申し訳ないです。 Array.prototype.slice.call(lists,0); ここでcallメソッドの引数で渡されてるlistsはHTMLCollectionという配列とは異なったオブジェクトらしいですが、なぜ配列とは異なったオブジェクトがArrayオブジェクトの中のthisに置き変われるのか分からないです...。
回答: `Array.prototype.slice`等は、「`length`プロパティと、0から`length-1`までの数字のプロパティを持つオブジェクト(Array-likeオブジェクト)」であれば、呼び出せるようです。 他の例: ``` a = {} a[0]=10 a[1]=20 a.length=2 Array.prototype.forEach.call(a, function(x){ console.log(x);} ) // a.forEach( function(x){ console.log(x);} ) // これはエラー console.log(a) Array.prototype.pop.call(a) console.log(a) // a.pop() // これはエラー ``` `pop`みたいに書き換えるメソッドは駄目かと思いましたが、いけますね。 すべてのメソッドが使えるのかどうかは知りませんが、いけそうな気がします。