"扩展"的语法ECMAScript 6

时间:2016-08-13 22:32:59

标签: javascript syntax ecmascript-6

由于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.

2 个答案:

答案 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