提问人:javalol 提问时间:3/24/2022 更新时间:3/24/2022 访问量:82
带有 Prototype JS 的 “this” 关键字
"this" keyword with Prototype JS
问:
我对JS中的“this”关键字感到困惑。我知道兔子的原型是动物,其中的“this”关键字应该是指兔子,但我认为应该指动物,我不明白为什么它没有定义?有人可以解释一下吗?rabbit.isSleeping
animal.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)
答:
2赞
CertainPerformance
3/24/2022
#1
当属性被分配给一个对象时 - 在这里,当你这样做时
this.isSleeping = true;
引擎将首先检查实例,然后检查其内部原型,依此类推,直到原型链的开头 - 以识别第一个具有属性的此类对象。如果找到一个对象,并且它是 setter,则调用 setter。否则,无论在何处找到该属性,都会为实例分配该属性(当然,作为数据属性)。isSleeping
当你这样做时
rabbit.sleep();
实例是 - 这是方法的内部。而且没有二传手,所以rabbit
this
isSleeping
sleep() {
this.isSleeping = true;
}
结果在实例 - 对象 - 接收属性。因此,对象保持不变。rabbit
animal
除非某处涉及 getters/setter,否则
someObj.someProp = someVal
将始终且只会导致变异,同时保持其内部原型不变。someObj
评论
0赞
javalol
3/24/2022
谢谢你的解释。为什么 animal.isSleeping return undefined?我们去原型链的 Object.prototype 吗?
1赞
CertainPerformance
3/24/2022
该属性不存在于 上,也不在原型链中,因此给出 undefined。它只存在于 - 你必须在那里检查它。rabbit
animal
rabbit
animal
animal.isSleeping
rabbit
1赞
Bergi
3/24/2022
@javalol 与 是一回事。在任何时候,都不会被写入,并且由于它没有在您的代码中定义,因此它是 .rabbit.sleep()
rabbit.isSleeping = true;
animal.isSleeping
undefined
评论
animal
没有财产。其属性为 和 。isSleeping
walk
sleep
__proto__
sleep
animal.isSleeping = true