我在书上找到了代码,并且遇到了一些问题。
var elems = {};
Array.prototype.push.call(elems, document.getElementById("first"));
alert(elems[0].nodeType); /It would output 1
答案 0 :(得分:2)
您的对象没有推送方法。通过使用.call()
,您指示.push()
对对象进行操作,就好像它是一个数组一样有效。
Array.push
不起作用(Firefox除外),因为.push
是为所有Array对象继承的方法。因此,它存在于.prototype
构造函数的Array
上。
如果你这样做了:
[].push.call(elems, ...)
它会起作用,因为您正在创建一个新数组,并通过继承获取.push()
,这来自Array.prototype
。
在Firefox中,您只需要这样做:
Array.push(elems, document.getElementById("first"));
这是因为Firefox有它所谓的“Array generics”,它接受作为第一个参数操作的对象,以及作为第二个(或更多)推送的项目。
答案 1 :(得分:1)
示例控制台会话以清理(阅读评论):
var elems = {};
Array.prototype.push.call(elems, 10); // you're telling 'push' to act like the argument is an array, even if it's not
// that's what 'call' does
> 1 // note that 'push' returns the length of the resultant array
elems
> Object {0: 10, length: 1} // 'push' is *acting* like 'elems' is an array, when really it's not
> Array.prototype.push // getting from 'prototype' which is basically all the properties that every Array has
function push() { [native code] }
> Array.push // this doesn't exist
undefined
> [].push // shows the 'prototype' chain
function push() { [native code] }