【发布时间】:2017-10-02 06:25:47
【问题描述】:
看了这个video之后,我了解到了一种用Javascript实现继承的好方法:原型继承。此方法使用 Object.create/Object.assign 基于另一个实例创建新对象。这似乎很有趣,因为很容易理解正在发生的事情。例如:
const human = {
species: 'human',
create: function(values) {
const instance = Object.create(this);
Object.assign(instance, values);
return instance;
},
sayName: function() {
console.log(`Hi, my name is ${this.name}`);
},
saySpecies: function() {
console.log(`Hi, I'm a ${this.species}`);
}
}
const musician = human.create({
species: 'musician',
playInstrument: function() {
console.log(`I'm a musician and I play ${this.instrument}`);
}
});
const aHuman = human.create({ name: 'Paul' });
aHuman.sayName();
aHuman.saySpecies();
const aMusician = musician.create({ name: 'David', instrument: 'Guitar' });
aMusician.sayName();
aMusician.saySpecies();
aMusician.playInstrument();
// how to check if musician is an instance of human?
console.log(musician instanceof human);
通过经典继承,我可以使用instanceof 来了解给定对象是否在其链中具有给定的proto(例如musician instanceof Human)。
这就是 proto 链的样子,看起来与使用 new 运算符创建的链非常相似。
问题 如何通过原型继承实现同样的目标?
【问题讨论】:
-
您的代码没有使用
Object.create。 -
对不起,让我扩充示例以显示正在使用的 Object.create。
-
完成。感谢您指出这一点。
-
它仍然不使用
Object.create。 -
我只是将 Object.create 替换为 Object.assign ,它确实会创建一个对象的新实例。让我更新一下问题。
标签: javascript inheritance prototype