由于ECMAScript 6中的类只是JavaScript现有的基于原型的继承的语法糖,因此仍然可以扩展" (缺少一个更好的词)具有EMCAScript 5语法的现有类的原型,并且即使在完全独立的文件中进行类声明之后也会向其添加方法。
/* 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类语法而不是回到原型语法?尝试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.
答案 0 :(得分:1)
不,没有办法做你想要达到的目标。
不能在许多文件中部分声明类。
顺便说一句,你应该可以使用像Grunt或Gulp这样的任务运行器,并实现一个任务来合并许多文件,声明可以生成单个文件的同一个文件,其中包含来自其他文件的单个类声明。也许这也可以作为Babel插件实现。
答案 1 :(得分:1)
extends
的语义是原型继承,而想要的行为是原型修改。这不是一项日常任务,它不是ES6中具有特殊语法的东西。
可以使用
执行此操作Object.assign(Dog.prototype, {
bark() {
console.log('bark bark');
}
});
请注意,对象文字中的bark
方法是可枚举的,而ES6 class methods are non-enumerable。如果这个特性至关重要,则应另外使用Object.defineProperty
。