2016-05-25 3 views
0

私は自分のコードをより読みやすくしようとしていました。これを行う方法はありますか? thisを呼び出すbuild.listときプロトタイプのサブオブジェクトこれはベースオブジェクトを参照していません

function Something(){ 
    this.$container = $('<div>'); 

    return this; 
} 

Something.prototype.build = { 
    list: function(){ 
     this.$container.append(...); 
    } 
} 

は現在、何が起こるかはthisbuildオブジェクト、ないSomethingオブジェクトを参照し、あります。

すべての名前をbuildList,buildComponentArrayなどに改名しない限り、この方法を使用する別の方法を理解できません。セマンティクスの可能性があります。

+0

(http://stackoverflow.com/q/15884096/1048572)オブジェクト参照と継承をperservingながら、JavaScriptのプロトタイプを整理]の可能性のある重複 - ちょうどそれをしません。 'buildList'などに名前を変更しても問題ありません。 – Bergi

+1

Javascriptはあなたが簡単にやろうとしていることを実際にサポートしていないので、このコンテキストではサブオブジェクトをあきらめてください。 'build.list'を' buildList'に変更すると、人生は再び簡単になります。 – jfriend00

+0

非常によく...愚かな私 –

答えて

0

これは基本的にあなたがthisにバインドされた機能にごthis.buildオブジェクト内のすべての機能を結合します

function Something(){ 
    this.$container = "<div></div>"; 

    //this creates a new object in the prototype chain for every instance 
    this.build = Object.create(this.build); 
    for (var prop in this.build) { 
     if (this.build.hasOwnProperty(prop) && typeof this.build[prop] === "function") { 
      this.build[prop] = this.build[prop].bind(this); 
     } 
    } 
    return this; 
} 

Something.prototype.build = { 
    list: function(){ 
     console.log(this.$container); 
    } 
} 

可能な解決策です。これをユーティリティ関数で抽出し、必要なすべてのネストされたオブジェクトをバインドすることができます。プロトタイプチェーンを操作/構築することも可能でなければならないと思われますが、見つけられませんでした。

あなたのほとんどはリファクタリングをお勧めしますが、私はこれをそこに置くと思っていますので、完全なソリューションがあります。

編集

指摘したように、あなたはthisを正しくバインド持つためにあなたのコンストラクタにbuildインタフェースを移動する必要があります。このソリューションは、コードを移動することなくこれを行うための単なる方法です。この1つはクリーンであり、より明示的にはプロトタイプいじりせずに何をするかを述べObject.create

を使用せずに

ソリューション。

function Something(){ 
    this.$container = "<div></div>"; 

    var build = this.build; 
    this.build = {}; 
    for (var prop in build) { 
     if (build.hasOwnProperty(prop) && typeof build[prop] === "function") { 
      this.build[prop] = build[prop].bind(this); 
     } 
    } 
    return this; 
} 

Something.prototype.build = { 
    list: function(){ 
     console.log(this.$container); 
    } 
} 
+0

実際には*複数のインスタンスを考慮していないので、*動作しません。プロトタイプ 'build'オブジェクトのメソッドを最後に作成した' Something'インスタンスにバインドしています。むしろ 'build'定義をコンストラクタに移動するだけです。 – Bergi

+1

@Bergiあなたは絶対に正しいです、私は2つの解決策を含めるために私の答えを更新しました。 – froginvasion

関連する問題