2016-08-13 6 views
0

ECMAScript 6のクラスは、JavaScriptの既存のプロトタイプベースの継承より構文的に単純なものであるため、既存のプロトタイプを「拡張」することができますクラスをEMCAScript 5構文で置き換え、クラス宣言の後でも完全に別のファイルにメソッドを追加します。ECMAScript 6のプロトタイプを拡張するための構文

/* 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. 
+1

実際はありません。 'extends'は、新しいクラスが古いクラスにあるものすべてを継承することを意味し、古いクラスを新しいプロパティで拡張しないことを意味します。そのためには、オブジェクトを新しいプロパティで「拡張する」必要があります。 – adeneo

答えて

1

extendsのセマンティクスはプロトタイプの継承ですが、必要な動作はプロトタイプの変更です。毎日の仕事ではなく、ES6で特別な構文を持つものではありません。

ES6 class methods are non-enumerableながら、オブジェクトリテラルでbark方法は、可算であること

Object.assign(Dog.prototype, { 
    bark() { 
     console.log('bark bark'); 
    } 
}); 

お知らせでこれを行うことが可能です。この特性が重要な場合は、Object.definePropertyを追加使用する必要があります。

1

いいえ、達成したいことをする方法はありません。

クラスを部分的に多くのファイルに宣言することはできません。

ところで、GruntやGulpのようないくつかのタスクランナーを使用して、同じファイルを宣言する多くのファイルをマージするタスクを実装することができます。

おそらく、Babelプラグインとして実装することもできます。

関連する問題