Hatena::ブログ(Diary)

hogehoge @teramako RSSフィード

 | 

2014-07-04

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);
  ...;
}

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

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/teramako/20140704/p1
 |