2

采取以下代码片段:

Foo() {}
var bar = new Foo(); /* uses Foo as constructor for new object */

现在我创建了一个函数,它将属性 x 添加到我的对象并将其值分配给 2;

function addX() {
this.x = 2;
}

我的问题是,为什么这不能成功地将 x 属性添加到 bar 对象:

addX(bar);

虽然这样做:

addX.apply(bar);

他们不应该做同样的事情吗?

我是一名初级 javascript 程序员,试图更好地理解语言和 OOP。没有对应的现实世界的例子,即我目前没有在一个项目的中间。我一直在学习我可以对对象做什么和不能做什么,我正试图找出原因。

4

3 回答 3

1

如果一个函数“应用于”一个对象,则意味着该函数将获得“this”变量,该变量将是对象本身。而只是调用 addX(bar) 将 bar 作为参数传递给函数。

所以 addX 是这样写的:

function addX(barObject) {
   barObject.x = 2;
}

调用 addX(bar) 会起作用。

而在您的示例 addX.apply(bar) 中,内部执行以下操作:

// apply does the following internally
bar.addX =  function()
{ 
   this.x = 2;
}
bar.addX()
// end of scope for apply

因此 addX(bar) 在您的示例中不执行任何操作,因为在这种情况下,“this”不属于函数本身之外的任何内容。

于 2013-09-08T18:48:20.083 回答
0

如下修改您的 addX 方法。调用您以前的方法不会将上下文作为参数传递。

function addX(barx) {
barx.x = 2;
}
于 2013-09-08T19:06:33.900 回答
0

每个函数都有一个特殊的“this”对象。当一个函数被调用时,this值被设置,它是对该函数正在操作的上下文对象的引用(当一个函数在网页的全局范围内被调用时,this this对象指向window对象)。函数的 apply() 方法用于调用具有特定 this 值的函数。使用 'bar' 参数提供的 apply 方法调用函数会将函数的 this 值设置为 bar 对象。

于 2013-09-08T19:12:20.273 回答