关于原型和数组的一些问题

时间:2014-01-17 01:32:37

标签: javascript

我在书上找到了代码,并且遇到了一些问题。

var elems = {};
Array.prototype.push.call(elems, document.getElementById("first"));
alert(elems[0].nodeType);  /It would output 1
  1. 我知道“call”是将push方法绑定到“elems”对象。但是“元素”是空的 对象,为什么空对象有“推”方法?
  2. 我试图将Array.prototype.push中的“prototype”丢弃到Array.push。但事实并非如此 工作。为什么?正如我从书中所知,由于原型链,可以找到该方法。 感谢。

2 个答案:

答案 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] }