ES 6におけるSymbolタイプの用法例の詳細

2829 ワード

この例では、ES 6のSymbolタイプについて説明する.皆さんに参考にしてあげます.具体的には以下の通りです.
SymbolはES 6に新しく加入するタイプです.
私たちが知っているように、JavaScriptには以下の種類があります.
Unidefined,Null,Boolean,Number,String,Object.
しかし、上記のタイプは、いくつかの状況を処理するには十分ではありません.次の例を挙げます.
divを移動する場合もあれば、divが移動しているかどうかを判断する必要があるので、divのようなオブジェクトに属性を設定したいと思います.

if (element.isMoving) {
 smoothAnimations(element);
}
element.isMoving = true;

しかし、このようにいくつかの問題があります.例えば:
私たちは第三者の倉庫と衝突するかもしれません.
私たちは未来の標準と衝突するかもしれません.
したがって、第二の方法を採用することができます.つまり、暗号化関数を用いて、値を設定します.

var isMoving = SecureRandom.generateName();
...
if (element[isMoving]) {
 smoothAnimations(element);
}
element[isMoving] = true;

このように確かに衝突問題を解決しましたが、デバッグ問題を持ってきました.私達は毎回この対象の属性を確認すると、大量のゴミの名前が見えます.
そこで、衝突問題を解決するために、ES 6はSymbolという新しいタイプを提案した.
Symbolは、オブジェクト属性の識別子として使用することができる特殊な可変でないデータタイプである.私たちはデモを見ます

var sym1 = Symbol();
var sym2 = Symbol("foo");
var sym3 = Symbol("foo");

Symbol("foo")は文字列「foo」をSymbolに強制しません.毎回新しいSymbolを作成します.

Symbol("foo") === Symbol("foo"); // false

したがって、この特性を利用してプライベート属性を作成することができます.

(function() {
 //   symbol
 var key = Symbol("key");
 function MyClass(privateData) {
  this[key] = privateData;
 }
 MyClass.prototype = {
  doStuff: function() {
   ... this[key] ...
  }
 };
})();
var c = new MyClass("hello")
c["key"] === undefined//       ,      

Symbolを利用して上記の衝突問題を解消することもできます.

// create a unique symbol
var isMoving = Symbol("isMoving");
...
if (element[isMoving]) {
 smoothAnimations(element);
}
element[isMoving] = true;

もちろん、外部と共有できるSymbolタイプを別の呼び出し方法で生成することもでき、Symbol.for方法である.Symbol.for(key)方法は、与えられたキーキーキーに基づいて、smbolレジストリから対応するsmbolを見つけ、見つけたらそれに戻る.そうでなければ、新しいsmbolを作成し、smbolレジストリに入れる.

Symbol.for("foo"); //      symbol     symbol     ,   "foo"
Symbol.for("foo"); //   symbol         "foo"  symbol
Symbol.for("bar") === Symbol.for("bar"); // true,       
Symbol("bar") === Symbol("bar"); // false,Symbol()              symbol
var sym = Symbol.for("mario");
sym.toString();
// "Symbol(mario)",mario     symbol   symbol        ,    symbol         

だから衝突を防止するために、smbolにプレフィックスを付けたほうがいいです.

Symbol.for("mdn.foo");
Symbol.for("mdn.bar");

本論文で述べたように、皆さんのECMAScriptプログラムの設計に役に立ちます.