由于 ECMAScript 6 中的类只是 JavaScript 现有基于原型(prototype)的继承的语法糖,因此仍然可以使用 EMCAScript 5 语法“扩展”(由于缺乏更好的词)现有类的原型(prototype),并将方法添加到即使在完全独立的文件中的类声明之后也是如此。
/* Dog.js */
class Dog {
woof() {
console.log('woof woof');
}
}
module.exports = Dog;
/* main.js */
var Dog = require('./Dog');
Dog.prototype.bark = function() {
console.log('bark bark');
};
var dog = new Dog();
dog.woof(); // 'woof woof'
dog.bark(); // 'bark bark'
有没有办法实现与上述相同的功能,但在 main.js
中保留 ECMAScript 6 类语法,而不是回到原型(prototype)语法?尝试诸如 class Dog extends Dog
之类的操作会引发错误,因为 Dog
类已被声明。
请注意,这并不是继承意义上的扩展,因为这需要创建一个新类,而不是向现有类添加方法。
class Dog {
woof() {
console.log('woof woof');
}
}
class AdvancedDog extends Dog {
bark() {
console.log('bark bark');
}
}
var dog = new Dog();
dog.woof(); // 'woof woof'
dog.bark(); // Error, not what is needed.
最佳答案
extends 的语义是原型(prototype)继承,而所需的行为是原型(prototype)修改。这不是一个日常任务,也不是 ES6 中具有特殊语法的东西。
可以通过以下方式做到这一点
Object.assign(Dog.prototype, {
bark() {
console.log('bark bark');
}
});
请注意,对象文字中的 bark
方法是可枚举的,而 ES6 class methods are non-enumerable 。如果此特征至关重要,则应另外使用 Object.defineProperty
。
关于javascript - ECMAScript 6 中 "extending"原型(prototype)的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38937543/