我有以下内容:
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对象的属性?为了缩短它,新的Particle()会创建它:
Particle.X
或者最好是:
Particle.Velocity.X
这个问题可能措辞不好,抱歉。我只是很难理解JavaScript中'this'关键字的范围。
答案 0 :(得分: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();
正如您所料,上面的代码警告"我的名字是Frank"。但是,如果你这样做:
var bar = {};
bar.name = 'Benny';
bar.say = foo.say;
bar.say();
上面的代码会警告"我的名字是Benny"。这是因为this
绑定到点之前的最后一个单词/名称。因此,即使该函数最初是在foo
的上下文中声明的,一旦它被bar
作为它的容器对象调用,它内部的this
将引用bar
。
有关this
在javascript中的工作原理的完整说明,请参阅我对其他问题的回答:How does the "this" keyword in Javascript act within an object literal?