DojoとPrototype.jsの違い

を見て思ったけど、たしかDojoスタイルはメンバーコピーをし、Prototype.jsスタイルはprototypeに設定してメンバーを継承させているんですよね。

これは一長一短で、前者は外部アクセスできないメンバーをコンストラクタ内のvar変数で簡単につかえるし、selfを使うことによる束縛を維持したメソッドオブジェクトが使えます。後者はthisを使い、prototypeの設定後でもメンバー更新を反映できます。
しかし、前者の方法で作ったオブジェクトを、後者のprototypeに設定すると、とても面白いことがおきちゃう。それは昨日書いたとおり。逆はどうだろうか。

// Dojoスタイルのオブジェクトの構造
var DojoType = function() {
  var self = this; // メソッドではthisの代わりに、基本はこれを使う
  var superObj = new SuperType(); // 親クラス
  for (var attr in superObj) { self[attr] = superObj[attr]; }
  
  var count = 0; // private
  this.name = ""; // public
  this.create = function () { init(); ... };
  var init = function () {...}:
};

var a = new DojoType();
var func = a.create // コード内でthisをつかわないので、どこで呼び出しても上記のaをコンテキストにして呼び出す。
// Prototype.jsスタイルのオブジェクトの構造
var PrototypeType = function() {
};
PrototypeType.prototype = new SuperType();
PrototypeType.prototype.create = function () { this.init(); ... }; // 固有メソッド定義(オーバーライドでも同じ)
PrototypeType.prototype.init = function () { ... }; PrototypeType.prototype.count = 0

var a = new PrototypeType();
var func = function () { return a.create(); } // コンテキストを維持するには関数でラップする。

m-hiyamaさんのこのJavaScriptシリーズは面白いかも(環境がわかりにくいけどRhinoなのかな)。蒸し返し歓迎とのことなので、過去のも見てみよう。