带有 Prototype JS 的 “this” 关键字

"this" keyword with Prototype JS

提问人:javalol 提问时间:3/24/2022 更新时间:3/24/2022 访问量:82

问:

我对JS中的“this”关键字感到困惑。我知道兔子的原型是动物,其中的“this”关键字应该是指兔子,但我认为应该指动物,我不明白为什么它没有定义?有人可以解释一下吗?rabbit.isSleepinganimal.isSleeping

let animal = {
  walk() {
    if (!this.isSleeping) {
      alert(`I walk`);
    }
  },
  sleep() {
    this.isSleeping = true;
  }
};

let rabbit = {
  name: "White Rabbit",
  __proto__: animal
};


rabbit.sleep();

alert(rabbit.isSleeping); // true
alert(animal.isSleeping)
javascript 这个 原型

评论

2赞 trincot 3/24/2022
animal没有财产。其属性为 和 。isSleepingwalksleep
4赞 evolutionxbox 3/24/2022
不要直接使用 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...__proto__
0赞 Daniel A. White 3/24/2022
@trincot如果你调用sleep
2赞 trincot 3/24/2022
@Daniel,但这并没有发生,是吗?当然,当你这样做时,它也会有它,但这与问题有什么关系?animal.isSleeping = true

答:

2赞 CertainPerformance 3/24/2022 #1

当属性被分配给一个对象时 - 在这里,当你这样做时

this.isSleeping = true;

引擎将首先检查实例,然后检查其内部原型,依此类推,直到原型链的开头 - 以识别第一个具有属性的此类对象。如果找到一个对象,并且它是 setter,则调用 setter。否则,无论在何处找到该属性,都会为实例分配该属性(当然,作为数据属性)。isSleeping

当你这样做时

rabbit.sleep();

实例是 - 这是方法的内部。而且没有二传手,所以rabbitthisisSleeping

  sleep() {
    this.isSleeping = true;
  }

结果在实例 - 对象 - 接收属性。因此,对象保持不变。rabbitanimal

除非某处涉及 getters/setter,否则

someObj.someProp = someVal

将始终且只会导致变异,同时保持其内部原型不变。someObj

评论

0赞 javalol 3/24/2022
谢谢你的解释。为什么 animal.isSleeping return undefined?我们去原型链的 Object.prototype 吗?
1赞 CertainPerformance 3/24/2022
该属性不存在于 上,也不在原型链中,因此给出 undefined。它只存在于 - 你必须在那里检查它。rabbitanimalrabbitanimalanimal.isSleepingrabbit
1赞 Bergi 3/24/2022
@javalol 与 是一回事。在任何时候,都不会被写入,并且由于它没有在您的代码中定义,因此它是 .rabbit.sleep()rabbit.isSleeping = true;animal.isSleepingundefined