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);