javascript - 为什么我不能在不使用原型(prototype)、调用或应用的情况下向对象添加属性?

标签 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。没有相应的真实示例,即我目前不在项目中。我一直在学习我能用对象做什么和不能做什么,我正试图找出原因。

最佳答案

一个函数如果“应用”到一个对象,将意味着该函数将获得“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”不属于任何东西,只属于函数本身。

关于javascript - 为什么我不能在不使用原型(prototype)、调用或应用的情况下向对象添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18687272/

相关文章:

Python:从B类中的A类调用方法A?

c++ - 游戏设计与程序语言和 OOP 语言的差异

PHP 为什么在构造中启动数据库连接不好?

c++ 对象初始化和构造函数语义

javascript - 基于 json 模式中枚举值的两种方式绑定(bind)依赖关系

javascript - 边缘浏览器: mouseleave event triggered when changing select value

javascript - ng-重复错误 : "Duplicates in a repeater are not allowed"

Python:如何用一些已知的值初始化 OOP 列表?

java - java中如何将二进制文件转换为对象

javascript - 选中一个复选框会选中所有复选框