非常に単純なコードでデコレータを使用する方法を理解しようとしているので、この概念をより大きなプロジェクトに適用できます。ここにあるAddyOsmaniの記事からヒントを得て、次のような簡単なコードを作成しました。
たとえば、メソッドを使用してというクラスがありCat
、meow()
以下のようにロギングで装飾したいとします。
class Cat {
@logger
meow() { console.log( ' Meeeoow! ') }
};
function logger(target, key, descriptor) {
console.log("Cat snarling...");
return descriptor;
}
const cat = new Cat();
cat.meow();
Node.jsインタープリター(バージョン9.1.0)に対してこれを実行しようとすると、次のエラーが発生します。
/Users/ravindranath/projects/decorators/index.js:2 @logger ^ SyntaxError: モジュールのObject.runInThisContext(vm.js:152:10)の createScript(vm.js:80:10)で 無効または予期しないトークン。 _compile(module.js:605:28) at Object.Module._extensions..js(module.js:652:10) at Module.load(module.js:560:32) at tryModuleLoad(module.js:503: 12) Function.Module._load(module.js:495:3) 、Function.Module.runMain(module.js:682:10) 、起動時(bootstrap_node.js:191:16) 、bootstrap_node.js:613: 3
だから、私の質問は次のとおりです。
Node.js 9.xはデコレータ構文をサポートしていますか?それとも、将来のバージョンで登場するのでしょうか?
express-js
GitHubにベースのデコレータがいくつかありますが、独自のデコレータを作成する方法がわかりません。誰かがNode.jsでカスタムデコレータを作成する簡単な基本的な例を提供できますか?
デコレータはECMAScript2016(別名7)の一部ではありません。デコレータは現在、機能が完成して言語の一部になる前に通過する4つのステージのうち、ステージ2ドラフトにあります。それらはおそらく近い将来言語に統合されるでしょうが、その機能と詳細は変更される可能性があります。このため、transform-decorators
Babelプラグインをインストールして、デコレータをノードランタイムが理解できるコード(ECMAScript 2016)に変換するには、Babelなどのトランスパイラーを使用する必要があります。
デコレータの作成に関しては、すでに作成しています。各デコレータは、別のデコレータをラップする関数であり、ユースケースtarget
に基づいた引数が提供されます。この場合、、、、key
およびdescriptor
。あなたのlogger
機能:
function logger(target, key, descriptor) {
console.log("Cat snarling...");
return descriptor;
}
すでにデコレータです。クラスのプロパティとメソッドの場合、target
はプロパティのクラスを参照し、key
はプロパティ名であり、descriptor
はプロパティの記述子です。次に、デコレータが呼び出され、クラスのプロパティがObject.defineProperty
一度脱糖されて定義されます。あなたの例はこれに要約することができます:
class Cat { }
let meowDescriptor = {
type: 'method',
initializer: () => () => {
console.log(' Meeeoow! ');
},
enumerable: false,
configurable: true,
writable: true
}
function logger(target, key, descriptor) {
console.log("Cat snarling...");
return descriptor;
}
meowDescriptor = logger(Cat.prototype, 'meow', meowDescriptor);
Object.defineProperty(Cat.prototype, 'meow', {
...meowDescriptor,
value: meowDescriptor.initializer()
});
クラス自体の場合、デコレータtarget
は、デコレートされたクラスを説明する1つの引数を取ります。私はそれを知るために主題に関するいくつかの文書を読むことを提案します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加