Javascriptでのシンボル

シンボルだけCreateSymbol()で作成する形では統一性がないので、他のオブジェクトも同様に作れるようにします。

記事の本題から外れた細かいつっこみなるけど、以下のように書くと new Symbol() でいけます。

var TAG_SYMBOL = 1;

function Symbol(str) {
    var instance = Symbol.symbols[str];
    if (instance == undefined) {
        instance = this;
        Symbol.symbols[str] = instance;
    }
    
    instance.tag = TAG_SYMBOL;
    instance.name = str;
    return instance;
}

(function() {
    if (!Symbol.symbols) { Symbol.symbols = {} }
})();


var sym1 = new Symbol("test1");
var sym2 = new Symbol("test1");
var sym3 = new Symbol("test3");

WScript.Echo(sym1 === sym2);    // => true
WScript.Echo(sym1 === sym3);    // => false
WScript.Echo(sym2 === sym3);    // => false

// 強引に値を書き換えた場合の動作
sym1.name = "x";
WScript.Echo(sym2.name);        // => "x"

修正(2006/1/10)

iriyakさんのコメントを参考に、シンボルテーブル初期化をコンストラクタから追い出し。