Javascript 使用[].push.call()修改对象';s长度

Javascript 使用[].push.call()修改对象';s长度,javascript,call,Javascript,Call,无法复制(«使用类似数组的对象») 你们能解释一下这里出了什么问题吗?另外,我似乎不明白这里的力学原理: // from the example: obj.addElem({}); obj.addElem({}); console.log(obj.length); // → 2 如果我们用不同的语法调用函数,而不是{},它会工作吗?如果不行,那我们为什么要确切地使用{}?这里的this上下文是什么:addEl方法还是对象本身?如果是第二个,为什么不使用addEl函数:它不是数组函数,所以它应该

无法复制(«使用类似数组的对象»)

你们能解释一下这里出了什么问题吗?另外,我似乎不明白这里的力学原理:

// from the example:
obj.addElem({});
obj.addElem({});
console.log(obj.length);
// → 2
如果我们用不同的语法调用函数,而不是
{}
,它会工作吗?如果不行,那我们为什么要确切地使用
{}
?这里的
this
上下文是什么:
addEl
方法还是对象本身?如果是第二个,为什么不使用
addEl
函数:它不是数组函数,所以它应该有自己的
this
(我想,我会使用类似
objThis=this;
属性的东西)


另一个相关问题是。

您文章中的代码有一些拼写错误:

  let obj = {
    length: 0,
    addEl: function (element) {
       [].push.call(this, element);
    };
     ^ syntax error
  };
  // Node REPL still expect me to do something, so there's an error. Why?
正如您在代码中的评论中所怀疑的, 有一个语法错误,我为您标记了它。 删除那个分号

然后,在尝试您编写的示例时,
obj.addElem
, 但是在上面的对象文本中,您有
addEl

如果你只是简单地复制粘贴它,这个例子应该可以很好地工作


如果我们用不同的参数调用函数,而不是
{}
,它会工作吗

当然会的。为什么不呢?JavaScript中的数组可以包含不同类型的值。 它不需要是同质的, 因此,是的,您可以插入除
{}
之外的其他内容

这里的
this
上下文是什么:
addEl
方法还是对象本身

它是调用方法的对象。所以它是obj。 这就是方法调用的工作方式。 调用
obj.something()
时,
something
中的
this
将是
obj



如果您对这个示例还有疑问,可以随意发表评论。

因为对象不是数组,但可以像数组一样工作,您需要从
数组
对象借用
推送

但在本例中,
指的是使用速记
[]
创建的数组对象。因此,我们需要使用
call
将其更改为
obj
的范围

由于定义了
length
属性,push将更新此值

空对象作为元素
{}
传递,但任何其他对象都可以:

让obj={
长度:0,
加法:函数(元素){
Array.prototype.push.call(this,element);//同时从Array.prototype借用push可以防止每次调用此函数时在内存中生成额外的数组。
}/«修复了此处的打字错误
};
obj.addEl({});
对象.增编(1);
对象附录(“a”);
附录(真);
控制台日志(obj)

你可以试试这个,我想这解决了你的问题。

也许这很傻,但为什么这里不需要分号呢?我认为,在每一条语句中都需要它(撇开JS引擎可以自己预测它们的位置这一事实不谈)。@JulyMorning这不是一条语句,而是一个对象文字。一个类似的例子是
{a:1,b:2;}
,这是不正确的
不应该在那里。在object-literal之后,要终止一个语句,当然应该放一个分号,例如
var-obj={a:1,b:2}请你看一下问题中的“我的编辑”好吗?@JulyMorning请不要在这个问题中问新问题。你原来的问题得到了回答。如果你有一个新问题,发布一个新问题,不要再改变这个问题。好的,我不会,但他们之间的关系如此密切…对不起。我只是想知道这种模式是如何运作的。
[]
是否是缩短每种情况下“Arryay.prototype”的适当方式?或者,对于每个调用/绑定函数?
[]
新数组()的缩写。当您使用类似数组的对象(如节点列表或具有属性的对象)时,有时需要对其使用数组函数。然而,对象并没有像forEach和push这样的函数。因此,我们转向主对象
数组
,并使用其原型借用其功能。然而,如果我们简单地执行
Array.prototype.push(element)
,它将尝试向数组主对象添加element,但失败了。因此,我们必须使用call或bind将对象链接到push传递其引用。
  let obj = {
    length: 0,
    addEl: function (element) {
       [].push.call(this, element);
    };
     ^ syntax error
  };
  // Node REPL still expect me to do something, so there's an error. Why?
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
var array = {
    length: 0,
    push: function(obj){
        this[this.length] = obj;
        this.length++;
    }
}

array.push(23);