Из этот пост в блоге у нас есть этот пример прототипного наследования в JavaScript:
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");
}
});
но я получаю ошибку типа.
Мои вопросы:
- Как добавить функцию
sayPlanet
вObject.create
? - это вообще "хороший способ" или есть лучший способ (лучшая практика)?
изменить
Я понял, как я могу добавить sayPlanet
внутри Object.create
:
sayPlanet: {
value: function(){
console.log("something different");
}
}
Однако остается второй вопрос. Кроме того, я был бы признателен, если кто-то сможет объяснить это на более глубоком уровне, если это "хороший способ" использовать его таким образом.
edit # 2: Как указал Махавир ниже, это ужасный пример, потому что, как оказалось, вы не можете (исправить меня, если я ошибаюсь) измените name
jane
, когда он был Object.create
d.
edit # 3: (человек, человек, это приведет меня к определенному объекту, где люди носят белые пальто). Поскольку @WhiteHat указывает ниже, действительно вы можете установить свойство name для обновления следующим образом:
var jane = Object.create(female, {
name: {
value: 'Jane',
writable: true
}
});
а затем вы можете сделать jane.name="Jane v2.0";
.
Я буду честным здесь, люди - у меня нет подсказки относительно того, в каком направлении идти, по-видимому, так много вариантов. И только сегодня я читаю Эрика Эллиота https://medium.com/javascript-scene/the-two-pillars-of-javascript-ee6f3281e7f3, и теперь я не знаю, что думать больше, потому что он продолжает утверждать, что люди на ES6 не совсем верно: O. Мех, я думаю, мне придется снова взглянуть на книгу Крокфордов, решиться на "один путь" и посмотреть, как далеко она меня ведет.