2013年4月17日

toString と valueOf を自分で定義する

JavaScript の Object は toString メソッドを定義すると暗黙的な文字列変換を制御できたのだー。

……実は JavaScript 1.0 の仕様だったんですね。仕様読め私。

という事でメモメモ。

let a2 = {
  x: 10,
  y: 20,
};
print (a2);

これだと結果は

[object Object]

こうなる。いつもの挙動。
でもこれじゃあ中身が何だかサッパリわからない。
そこで toString メソッドを定義する。

let a = {
  x: 10,
  y: 20,
  toString: function () {
    return "(" + this.x + "," + this.y + ")";
  }
};
print (a);

すると

(10,20)

こうなる。わぁ、なんてベンリ。

ちなみに JavaScript 1.1 の仕様に valueOf ってのもある。文字列変換だけじゃなくて、プリミティブな値が欲しい時に呼ばれるメソッド。

let a = {
  x: 10,
  y: 20,
  toString: function () {
    return "(" + this.x + "," + this.y + ")";
  },
  valueOf: function () {
    return "[" + this.x + "," + this.y + "]";
  }
};
print (a);
print (a + "");

1 個目の print では直接文字列表記を取得するので toString、2 個目の print ではその前に文字列演算があって、プリミティブな値を必要とされるので valueOf が呼ばれる。

(10,20)
[10,20]

たとえ文字列演算でも toString ではなく、valueOf が呼ばれる。

計算可能な値をラップするのに使えたりするかもしれない。でも不安なのでたぶん値を取り出すメソッドが getter を定義すると思う。

toString しか用意してなければプリミティブな値を必要とする場合にも toString が呼ばれる。

let a = {
  x: 10,
  y: 20,
  toString: function () {
    return "(" + this.x + "," + this.y + ")";
  }
};
print (a);
print (a + "");

すると

(10,20)
(10,20)

こんなかんじ。

実用にはどうかなーって気もするけど、デバッグにはいいかもしれない。

0 件のコメント:

コメントを投稿