ただし、著者の Nicholas C. Zakas は、[ダイナミック プロトタイプ] メソッドを使用してオブジェクトを作成するときに起こり得る問題と解決策については詳しく説明しませんでした。ただし、[動的プロトタイプ] のボトルネックのみが継承時に説明されます。つまり、サブクラスの継承が実行される場合、動的プロトタイプでは実現できません。
原文はおおよそ次のとおりです。
継承メカニズムを動的にできない理由は、プロトタイプ オブジェクトの一意性です。コード例:
>return __initialize ;
}();
var obj('aa');
var obj('bb'); // aa
obj2.showName() // bb
実際、上記のメソッドは、Obj のコンストラクター内の __initialize を通じてプロパティが初期化され、__initialize.prototype プロトタイプ初期化メソッドが使用されます。ちょっとした「ズル」のように感じます。 __initialize は Obj の初期化を表します。
以下は、tangoboy の「構築されたクラス」のカプセル化です。実際、考え方は基本的に上記と同じです。唯一の違いは、属性も追加していることです。プロトタイプ モードで作成され、初期化プロパティとメソッドがコンストラクター パラメーター オブジェクトにスローされました。簡単にカスタマイズできます:
/* == フォームTangoboy == */
window['$Class'] = {
//混合コンストラクター/プロトタイプメソッドを使用してクラスを作成します
create: function(config) {
var obj = function() {}, config = config||{};
//フィルターコンストラクターとプロトタイプメソッド
obj = obj.prototype.constructor = config["__"]||obj;
delete config["__ "] ;
obj.prototype = config;
return obj;
}
}
/* -- 例 -- */
var man = $Class.create({
__ : function (name) {
this.name = name;
},
性別 : '男性',
showName : function () {
alert(this.name) );
}
});
var me = new man('ru')
me.showName(); //ru
視覚的な統一を追求したい場合は、動的プロトタイピングを行わずに実現することもできます。結局のところ、上記の考え方を見ると、最も一般的に使用されている「クラス構築」メソッドに遡ることができます:
var Class = {
create : function () {
return function () {
this.initialize.apply(this, argument);
}
}
}
上記のコードは誰でもよく知っていると思いますが、注意深く調べてみると、実際には上記と一致していることがわかります。このコードでは、initialize 関数が初期化エージェントとして使用され、視覚的な統一が完了します。