JavaScript 注釈: デコレータが注釈構文をクラスに追加する方法
この記事では、現在の JavaScript で注釈がどのように見えるかについて説明します。 私たちがアノテーションと呼ぶのは、Java のような言語の古典的なアノテーションとは違うからです。
ただし、2022 年 4 月 24 日現在、Decorators はまだステージ 3 の提案です。 これは、JavaScript でデコレーターがまだ使用できないことを意味します。
ただし、それらが利用可能になると、クラス宣言の注釈構文を追加する方法が提供されます。
デコレータの提案前の注釈
JavaScript のデコレータの提案より前に、注釈に最も近いのは "use script"
ディレクティブです。 例えば:
(function() {
'use strict';
// code in strict mode
})();
上記のコードでは、"use strict"
ディレクティブにより、関数内で厳密モードが実行されます。
デコレーター入門
デコレータの提案 によると、デコレータは、外部の動作を変更することなく、メタプログラミングや値への機能追加に使用できる関数です。 彼らは次のことに取り組みます。
- クラス
- クラスメソッド
- クラスフィールド
- クラスアクセサ
- クラスの自動アクセサー
これらの要素でデコレーターを呼び出した後、デコレーターは次のことを実行できます。
- デコレーターは、メソッドを別のメソッドに、またはクラスを別のクラスに置き換えることができます。
- デコレーターは、アクセサー関数を介して装飾された値へのアクセスを提供できます。
- デコレータは、装飾したい値を初期化できます。
デコレータの構文
Decorators の提案は現在、ステージ 3 にあります。 ただし、ステージ 2 の構文を使用します。したがって、デコレーターの構文には以下が適用されます。
-
式は一連の変数に制限されます。 また、角かっこ表記ではなく、ドット表記でプロパティ アクセスを行います。
ただし、任意の式が必要な場合は、
@(expression)
を使用できます。 -
クラス式とクラス宣言をデコレートできます。
-
クラス デコレータは
export
とdefault
の後にあります。
デコレータの評価
デコレータの評価は、次の手順に従います。
- デコレーター式は、計算されたプロパティ名で評価されます。
- デコレータは、クラス定義中に 関数と呼ばれます。 これは、メソッドの評価後、プロトタイプとコンストラクターの前に発生します。
- デコレーターは、コンストラクターとプロトタイプを一度に変更します。
デコレーターの呼び出し
デコレーターを呼び出すと、2つのパラメーターを受け取ります。 これらのパラメータは次のとおりです。
- 飾りたい価値。 クラス フィールドの場合、この値は
未定義
です。 - 装飾される値に関する情報を含むコンテキスト オブジェクト。
デコレータの例
以下は、Decorator 提案の類似コード に触発されたサンプル コードです。
export function log(target) {
if (typeof target.descriptor.value === 'function') {
const original = target.descriptor.value;
target.descriptor.value = function(...args) {
console.log('arguments: ', args);
const result = original.apply(this, args);
console.log('result: ', result);
return result;
}
}
return target;
}
その後、デコレータは次のように機能します。
import {log} from './decorators.js';
export default class DogSounds {
@log
barkSound() {
console.log('woof');
}
@log
say(to_say) {
console.log(to_say)
return 'The dog said ' + to_say
}
}
上記のコードから、@
記号を介したデコレータの適用は、Java などの言語の注釈に似ていることがわかります。
-
JavaScript でデコレータを使用できますか?
いいえ。2022 年 4 月の時点では、まだステージ 3 の ECMA 提案であるためです。
-
JavaScript でデコレータを使用できるのはいつですか?
デコレータの提案がステージ 4 に達し、ECMAScript の次の版に含まれると、JavaScript でデコレータを使用できるようになります。
Habdul Hazeez is a technical writer with amazing research skills. He can connect the dots, and make sense of data that are scattered across different media.
LinkedIn