<分区>
来自 this blog post我们有这个 JavaScript 原型(prototype)继承的例子:
var human = {
name: '',
gender: '',
planetOfBirth: 'Earth',
sayGender: function () {
alert(this.name + ' says my gender is ' + this.gender);
},
sayPlanet: function () {
alert(this.name + ' was born on ' + this.planetOfBirth);
}
};
var male = Object.create(human, {
gender: {value: 'Male'}
});
var female = Object.create(human, {
gender: {value: 'Female'}
});
var david = Object.create(male, {
name: {value: 'David'},
planetOfBirth: {value: 'Mars'}
});
var jane = Object.create(female, {
name: {value: 'Jane'}
});
david.sayGender(); // David says my gender is Male
david.sayPlanet(); // David was born on Mars
jane.sayGender(); // Jane says my gender is Female
jane.sayPlanet(); // Jane was born on Earth
现在,我想知道如何正确地“覆盖”,例如 sayPlanet
函数?
我试过这样的:
jane.sayPlanet = function(){
console.log("something different");
};
这行得通。
不过,我也这样试过:
var jane = Object.create(female, {
name: {value: 'Jane'},
sayPlanet: function(){
console.log("something different");
}
});
但是我得到一个类型错误。
我的问题是:
- 如何在
Object.create
中添加sayPlanet
函数? - 这到底是“好方法”还是有更好的(最佳实践)方法?
编辑:
我想出了一种方法可以将 sayPlanet
添加到 Object.create
中:
sayPlanet: {
value: function(){
console.log("something different");
}
}
然而,第二个问题仍然存在。另外,如果有人可以更深入地解释它,如果这是像这样使用它的“好方法”,我将不胜感激。
编辑 #2: 正如 Mahavir 在下面指出的,这是一个糟糕的例子,因为事实证明你不能(如果我错了请纠正我 ) 在 Object.create
d 之后更改 jane
的 name
。
编辑#3:(伙计,伙计,这会让我进入某个人们穿着白大衣的设施)。正如@WhiteHat 在下面指出的那样,您确实可以将名称属性设置为可更新,如下所示:
var jane = Object.create(female, {
name: {
value: 'Jane',
writable: true
}
});
然后您可以执行 jane.name="Jane v2.0";
。
老实说,面对如此多的选择,我不知道该往哪个方向走。就在今天,我读了 Eric Elliot https://medium.com/javascript-scene/the-two-pillars-of-javascript-ee6f3281e7f3现在我不知道该怎么想了,因为他继续争辩说 ES6 的人做得不太对:O。嗯,我想我将不得不再次重温 Crockfords 的书,决定“单向”,看看它能带我走多远。