Symbolの使い道 - 他に迷惑を掛けないプロトタイプ拡張

先日 Firefox Nightly で Symbol が実装されたわけだが、その使い道を考えていた。それで思いつたのが、Symbolを使えば迷惑を掛けずにプロトタイプ拡張ができるのでは、ということ。

こんな感じ。

"use strict";
{
  let keys =    Symbol.for("teramako.Object.keys"),
      values =  Symbol.for("teramako.Object.values"),
      entries = Symbol.for("teramako.Object.entries");

  Object.prototype[keys] = function* () {
    yield * Object.keys(this);
  };
  Object.prototype[values] = function* () {
    for (var key of this[keys]())
      yield this[key];
  };
  Object.prototype[entries] = function* () {
    for (var key of this[keys]())
      yield [key, this[key]];
  };
}
  • プロパティキーは文字列ではなく、シンボルなので、Object.keys,Object.getOwnPropertyNames,for-in で出てくることはない。
  • 他所からも呼び出せるようにSymbol.for()でSymbolをつくる

他コンテキストのブロックからも以下の様な感じで呼び出せる。

let entries = Symbol.for("teramako.Object.entries")
for (var [k, v] of obj[entries]()) {
  console.log(k + ": " + v);
  ...;
}

この完全にプライベートというわけでもなく、かと言ってパブリックな感じでもない微妙な感じが堪らなく良く思えるのだが、どうだろう?