ES6-シンボル
シンボル入門
ES6では、Symbolと呼ばれる新しいプリミティブ型が導入されています。これらは、JavaScriptプログラムにメタプログラミングを実装するのに役立ちます。
構文
const mySymbol = Symbol()
const mySymbol = Symbol(stringDescription)
シンボルは、データを格納できる単なるメモリです。各シンボルは、異なるメモリ位置を指します。Symbol()コンストラクターによって返される値は一意であり、不変です。
例
例を通してこれを理解しましょう。最初に、説明のない2つのシンボルを作成し、その後に同じ説明のあるシンボルを作成しました。どちらの場合も、シンボルが比較されると、等価演算子はfalseを返します。
<script>
const s1 = Symbol();
const s2 = Symbol();
console.log(typeof s1)
console.log(s1===s2)
const s3 = Symbol("hello");//description
const s4 = Symbol("hello");
console.log(s3)
console.log(s4)
console.log(s3==s4)
</script>
上記のコードの出力は以下のようになります-
symbol
false
Symbol(hello)
Symbol(hello)
false
シニア番号 | プロパティと説明 |
---|---|
1 | Symbol.for(key) 指定されたキーを使用してシンボルレジストリ内の既存のシンボルを検索し、見つかった場合はそれを返します。それ以外の場合は、このキーを使用してグローバルシンボルレジストリに新しいシンボルが作成されます。 |
2 | Symbol.keyFor(sym) 指定されたシンボルのグローバルシンボルレジストリから共有シンボルキーを取得します。 |
シンボルとクラス
シンボルをクラスで使用して、クラスのプロパティを定義できます。利点は、プロパティが以下に示すようにシンボルである場合、シンボル名がわかっている場合にのみ、パッケージの外部からプロパティにアクセスできることです。そのため、シンボルをプロパティとして使用すると、データはかなりカプセル化されます。
例
<script>
const COLOR = Symbol()
const MODEL = Symbol()
const MAKE = Symbol()
class Bike {
constructor(color ,make,model){
this[COLOR] = color;
this[MAKE] = make;
this[MODEL] = model;
}
}
let bike = new Bike('red','honda','cbr')
console.log(bike)
//property can be accessed ony if symbol name is known
console.log(bike[COLOR])
</script>
上記のコードの出力は以下のようになります-
Bike {Symbol(): "red", Symbol(): "honda", Symbol(): "cbr"}
red