これは基本的にあなたが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);
}
}
(http://stackoverflow.com/q/15884096/1048572)オブジェクト参照と継承をperservingながら、JavaScriptのプロトタイプを整理]の可能性のある重複 - ちょうどそれをしません。 'buildList'などに名前を変更しても問題ありません。 – Bergi
Javascriptはあなたが簡単にやろうとしていることを実際にサポートしていないので、このコンテキストではサブオブジェクトをあきらめてください。 'build.list'を' buildList'に変更すると、人生は再び簡単になります。 – jfriend00
非常によく...愚かな私 –