这里的“ this”关键字有什么用?

时间:2018-12-08 09:52:26

标签: javascript class

class Rabbit1 {
  constructor(name, color, type) {
    if (arguments.length !== 3) throw new Error("Wrong length of arguments given");
    this.ar1 = name;
    this.ar2 = color;
    this.ar3 = type;
    this.testExtra = [];
    if (!name) {
      this.testExtra[0] = "This is in the constructor";
    } else {
      this.testExtra[0] = "Name is True";
    }
  }
  speak(line) {
    console.log(`The ${this.ar2} Rabbit, called '${this.ar1}'  and says it\ 's a ${this.ar3} rabbit, Oh and it\'s saying ${line} too... ${this.testExtra}`);
  }
  speak2(speak) {
    console.log("Hello " + this.ar1);
  }
}

let blackR = new Rabbit1(false, "black", "gentle");

blackR.speak("Hello");

我问这个问题是因为,如果您看一下

if (!name)

使用绑定name,它引用该类实例的name(在本例中为blackR)。

因此,当this.name本身引用类实例中给出的name值时,为什么要使用name

请忍受缩进不良。 谢谢。

1 个答案:

答案 0 :(得分:0)

  

使用绑定name,它引用该类实例的name(在本例中为blackR)。

不,不是。 name 是构造函数中的第一个参数:

constructor(name, color, type) {

通话中的第一个值为false

let blackR = new Rabbit1(false, "black", "gentle");

这就是分配给 name 的值。它还已分配给 this.ar1 中的

this.ar1 = name;

代码产生:

"The black Rabbit, called 'false'  and says..."

其中显示 this.ar1 的值为 false

  

所以当this.name本身引用名称值时,为什么我们使用name

表达式 this.name 没有出现在OP中。如果您的意思是“为什么使用this.ar1而不是名称”,则无法从发布的代码中分辨出来。在构造函数中,它们本质上是相同的,并且具有相同的值。

但是, ar1 是实例的公共属性,因此可以在以后进行更改。