将数组原型函数与非数组一起使用

时间:2016-03-16 04:41:30

标签: javascript prototype-chain

正如我们所知,我们可以使用带有参数功能的数组原型方法,如下所示。

function abc() {
   // As 'arguments' is a array like object which don't have Array prototype functions.
   Array.prototype.push.call(arguments, 30);
   console.log(arguments);
}
abc(10, 20);   // Output is: [10, 20, 30]

所以我明智地尝试使用推送DOM元素 classList ,如下所示,这给了我一个错误"无法设置[object Object]的属性长度,它只有一个getter"

var bodyClassList = document.body.classList;
Array.prototype.push.call(bodyClassList, 'myClass');

注意:我刚刚尝试学习概念,这就是为什么我使用push,即使它内置了 add()方法。

所以我的问题是:

我们可以在哪些对象上使用Array.prototype方法?

提前致谢。

1 个答案:

答案 0 :(得分:2)

Array.prototype方法是非常通用的方法,适用于所有类型的对象。他们只是获取和设置索引属性以及调用它们的对象的.length。 (并且,对于ES6,如果需要创建新实例,则为.constructor个实例的Array属性。您可以check the spec查看push的具体内容。

所以基本上,回答你的问题......

  

我们可以在哪些对象上使用Array.prototype方法?

...在所有对象上。也就是说,在操作它们时不会抛出异常的对象。请注意,push本身不会抛出错误。

一些例子:

var x = {0:0, length:1};
Array.prototype.push.call(x, 1);
console.log(x); // {0:0, 1:1, length:2}
console.log(Array.prototype.slice.call(x)); // [0, 1]
var y = {0:0, get length() { throw new Error("boo!"); }}
Array.prototype.push.call(y, 1); // throws
var z = {get 0() { throw new Error("boo!"); }, length: 1};
Array.prototype.push.call(z, 1);
console.log(z); // {0:…, 1:1, length:2}
console.log(Array.prototype.slice.call(z)); // throws

arguments对象与x非常相似。 classListy非常相似。