Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2008-06-03><

nsIWritablePropertyBag と wrappedJSObject

| 13:30 |  nsIWritablePropertyBag と wrappedJSObject - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  nsIWritablePropertyBag と wrappedJSObject - Ci.nsIZIGOROu

d:id:fls さんに教えて貰った wrappedJSObject と nsIWritablePropertyBag についてです。

準備

function wrapped(obj) {
  return { wrappedJSObject: obj };
}

とか定義しておく。

実験

var props = Cc["@mozilla.org/hash-property-bag;1"].createInstance(Ci.nsIWritablePropertyBag);
var data = {a: 1, b: 2};
props.setProperty("foo", data);
props.setProperty("bar", wrapped(data));

とした時に、getPropertyしたらどうなるかと言う話。

Fx2
props.getProperty("foo")
[xpconnect wrapped nsISupports]{QueryInterface: function() {}}

となり、props.getProperty("foo").a とか取れません。

一方で wrappedJSObject しておくと、

props.getProperty("bar");
// [xpconnect wrapped nsISupports] — {QueryInterface: function() {…}}
props.getProperty("bar").wrappedJSObject;
// [object Object] — {a: 1, b: 2}

と言う訳で wrappedJSObject プロパティが出来てます。

Fx3

こっちはgetPropertyした時点で生のJSオブジェクトが帰って来ます。つまり

props.getProperty("foo").a; // 1
props.getProperty("bar").wrappedJSObject.a; // 1

便利になったけど、互換性のある書き方としては後者のwrappedJSObjectを使う場合ですね。

まとめ

と言う訳でwrappedJSObject使うと幸せになれます^^