为什么我不能在不使用原型,调用或应用的情况下向对象添加属性?

时间:2013-09-08 18:37:59

标签: javascript oop object apply

请使用以下代码段:

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。没有相应的现实世界的例子,即我目前不在项目的中间。我刚刚学习了我能做什么,不能用对象做什么,我想弄明白为什么。

3 个答案:

答案 0 :(得分: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”不属于除函数本身之外的任何东西。

答案 1 :(得分:0)

修改addX方法,如下所示。调用前一个方法不会将上下文作为参数传递。

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

答案 2 :(得分:0)

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