使用构造函数而不分配变量的Javascript'THIS'值

时间:2019-02-21 09:38:07

标签: javascript constructor new-operator

我目前正在尝试使用Javascript构造函数并编写了一些代码,但我自己还不太了解

function someOtherFunction() {
    new Player(0, 0);
}

function Player(x, y){

    let self = this;

    this.x = x;
    this.y = y;

    window.addEventListener('click', function() {
        self.x++;
        self.y++;

        console.log('x:' + self.x + 'y: ' + self.y);
    });
}

someOtherFunction();

我创建了一个构造函数,该构造函数在使用New关键字时执行,该关键字随后设置x和y值,并将事件侦听器绑定到window对象。

对于新播放器的实际存储位置以及它如何引用this.x和this.y并增加其值,我感到困惑。

我没有将新Player分配给变量来创建对象,所以我不确定这是指向什么?

我没有写:

let a = new Player(0, 0);

然后this.x将引用对象'a'的x属性。所以当我没有将它分配给变量时,this.x指的是什么?它如何不断递增?

我想也许我创建了一个闭包,但是我正在函数内部创建一个播放器的新实例,我假设一旦调用并执行,get就会被丢弃,因此它如何保持对对象x和y属性的引用而不分配给一些变量。

2 个答案:

答案 0 :(得分:3)

  

我没有将新Player分配给变量来创建对象,所以我不确定这是指向什么?

调用new Player创建一个对象。

对该对象有两个引用。

  • this在函数内部
  • 函数的返回值

您丢弃后者。

您将前者复制到名为self的变量中。

这已被事件处理程序函数关闭。参见How do JavaScript closures work?

  

然后this.x将引用对象'a'的x属性。所以当我没有将它分配给变量时,this.x指的是什么?它如何不断递增?

仅通过使用this关键字即可将其分配给变量new

  

我想我可能创建了一个关闭

  

但是我正在函数内部创建一个播放器的新实例,我假设一旦调用并执行get便会将其丢弃

闭包的全部目的是使变量在关闭它的函数中保持活动状态。

答案 1 :(得分:0)

在JavaScript中,不是基本类型(布尔,空,数字,字符串,未定义)的所有内容都是对象。因此,您创建的函数是一个对象。

使用new实例化Object的实例。每个实例都有一个自动的this变量。