这是一个非常好奇的问题,我一直在学习一些Javascript,并且我的代码可以正常工作,但是我想了解为什么会发生这种情况:
为什么在Object.create之外创建att和def增强功能时它们可以工作,但是hp属性作为常量工作呢?
let Pokemon = {
def: this.def,
att: this.att,
defBoost: function() {
this.def = this.def + this.def
return this.def;
},
attBoost: function() {
this.att = this.att + this.att
return this.att;
},
hpBoost: function() {
this.hp = this.hp + this.hp
return this.hp;
}
}
let psyduck = Object.create(Pokemon, {
name: {
value: "Psyduck"
},
hp: {
value: 500
}
});
psyduck.def = 12;
psyduck.att = 20;
console.log(psyduck);
psyduck.attBoost();
psyduck.defBoost();
psyduck.hpBoost();
console.log(psyduck);
答案 0 :(得分:1)
当您使用descriptor定义属性时,例如在Object.defineProperties
或Object.create
中,所有您未指定的属性默认为false
。所以当你有
hp: { value: 500}
就像
hp: {
value: 500,
enumerable: false,
writable: false,
}
writable: false
表示该属性为只读。
另一方面,在通过赋值创建属性时,enumerable
和writable
都默认为true
。
此外,请确保始终写入strict mode,以便将其分配给只读属性会引发错误,而不是无提示地失败!