2

すべて、javascript OOP オブジェクトを定義する従来の方法を知っていました。ここに例があります。

var TField=function(jData)
{
   this.id=jData.id;
   this.name=jData.name;
   this.attributes=jData.attributes;
   TField.prototype.render=function(){
      alert(jData.id);
   };
};

が呼び出されるたびにTField.prototype.render、 の値が何であるかを知ることができます。これは、 の機能によるものです。jDataClosure

しかし今、私はjavascriptで継承を実装しようとしました.そして、推奨される方法はMixin pattern. これまでに行ったコードは次のとおりです。

TChildField.prototype.render=function(){
      alert('TChildField render.');
      //Can not utilize the parameters of the constructor. like jData
};


var TField=function(jData)
{
   this.id=jData.id;
   this.name=jData.name;
   this.attributes=jData.attributes;

};

TField.prototype.render=function(){
      alert('TField render.');
};

var TChildField=function(jData)
{
    TField.call(this,jData)
}

var tobj={id:"1",name:"test",attribute:{}};
TChildField.prototype=Object.create(TField.prototype)
TChildField.prototype.render=function(){
      alert('TChildField render.');
};
var c= new TChildField(tobj);
alert(c.id);
alert(c.name);

まあ、問題なく正常に動作します。しかし、私の問題は、 TField のようなjDataコンストラクターのパラメーターを利用できないことがわかったことです。で使用できるようにTChildField定義できることはわかっていましたが、プロパティとして使用したくありません。それの最悪のことは、の利益を失うことです。それを作る方法はありますか? または、私が知らなかった何か?ありがとう。this.Data=jDataTChildField.prototype.renderClosure

4

1 に答える 1

1

このカプセル化は何のために必要ですか? 設定の何が問題になっていますthis.Data=jDataか? それは簡単で、あなたの問題を解決します。そして、最悪の事態が閉鎖のメリットを失うことである理由は何ですか? 実際、クロージャは非常にファンキーな問題 (メモリ リーク?) を引き起こす可能性があるため、避ける必要があります。

于 2013-04-08T11:08:07.047 に答える