push跟apply的结合使用

路人丁0417
  • 123

在mdn上看到的一段:像数组一样使用对象

Array.prototype.push 可以在一个对象上工作。 注意,我们没有创建一个数组来存储对象的集合。 相反,我们将该集合存储在对象本身上,并使用在 Array.prototype.push 上使用的 call 来调用该方法,使其认为我们正在处理数组,而它只是像平常一样运作,这要感谢 JavaScript 允许我们建立任意的执行上下文。

var obj = {
    length: 0,

    addElem: function addElem (elem) {
        // obj.length is automatically incremented 
        // every time an element is added.
        [].push.call(this, elem);
    }
};

// Let's add some empty objects just to illustrate.
obj.addElem({});
obj.addElem({});
console.log(obj.length);
// → 2

我想知道这种情况有什么实际的使用场合吗?

回复
阅读 1.3k
1 个回答
✓ 已被采纳

常用的场景是为一个非数组的引用对象插入值,比如:

var a = {};

//此时肯定不能直接a.push(),会报错,而通过call借用array的原型链方法,使对象也能使用push方法

[].push.call(a,1,2,3,4); // {0:1,1:2,2:3,3:4,length:4}

此外:
call , apply, bind 等方法使用的场景之一就是通过改变this指向,借用原型链上的一些方法

你知道吗?

宣传栏