gpt4 book ai didi

javascript - 在原型(prototype)继承中创建新对象时如何覆盖函数?

转载 作者:可可西里 更新时间:2023-11-01 02:20:58 26 4
gpt4 key购买 nike

<分区>

来自 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.created 之后更改 janename

编辑#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 的书,决定“单向”,看看它能带我走多远。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com