0

我有以下内容:

function Vector(X,Y,Direction)
{
    this.X = X,
    this.Y = Y,
    this.Direction = Direction
}

function Particle(Position,Size)
{
    this.Position = Position,
    this.Size = Size,
    this.Velocity = new Vector(0,0,0)
}

Vector是一个构造函数,它创建一个向量对象,这个对象是由另一个构造函数Particle创建的,它在Velocity属性下创建一个粒子对象。

JavaScript 会在 Particle 对象下还是在 Particle.Velocity 下将构造的 Vector 对象的属性作为父级?简而言之,new Particle() 会创建这个:

粒子X

或者最好是这样:

粒子.速度.X

这个问题可能措辞不好,抱歉。我只是很难理解 JavaScript 中“this”关键字的范围。

4

1 回答 1

2

会的Particle.Velocity.X。不是因为范围,this而是因为你这样做了:

this.Velocity = new Vector(0,0,0);

您正在分配给对象的Velocity属性Particle

但是this在 javascript 中的工作方式不同,因此值得花一些时间来理解它。它不直接绑定到它声明/编写的对象,而是在运行时根据函数/方法的调用方式绑定到不同的事物。

例如,考虑以下情况:

var foo = {};
foo.name = 'Frank';
foo.say = function () {alert('My name is' + this.name)}
foo.say();

如您所料,上面的代码会提示“我的名字是弗兰克”。但是,如果你这样做:

var bar = {};
bar.name = 'Benny';
bar.say = foo.say;
bar.say();

上面的代码将提醒“我的名字是 Benny”。那是因为this绑定到点之前的最后一个单词/名称。因此,即使该函数最初是在 的上下文中声明的foo,一旦将其bar作为容器对象调用,其this内部也会引用bar.

有关thisjavascript 工作原理的完整描述,请参阅我对另一个问题的回答:Javascript 中的“this”关键字如何在对象文字中起作用?

于 2013-10-17T02:42:23.370 回答