2011-06-18 5 views
2

これは私を逃しています。私はこれを行うことができるようにしたい理由は、次のシナリオのようなものですインスタンスのメソッドに割り当てられた変数のコンテキストを保存します

function tSt(val) { 
    this.val = val; 
} 

tSt.func = function(x) { 
    return x * 2; 
} 

tSt.prototype.func = function() { 
    return tSt.func(this.val); 
} 

var tmp = new tSt(5); 

console.log(tmp.func()); // 10 

var other = tmp.func; 

console.log(other()); // undefined 

これが達成することができますどのように
(function(funcarr) { 
    for (var i = 0; i < funcarr.length; i++) 
     console.log(funcarr[i]()); 
})([ tmp.func ]); 

次のコードを取りますか?

更新:

ここでは、潜在的に、よりグローバルなソリューションですが、私はそれをこのように行うのいずれかの欠点があるかどうかわからない:

​​

答えて

3

使用Function#bind

var other = tmp.func.bind(tmp); 

otherが呼び出されるたびにthisポインタがtmp

bindはすべてのブラウザで実装されているわけではないので、上記リンクのようなポリフィルが必要になることがあります。 (実際には、私はあなたがすべての道を行くとES5 shimを取得をお勧めします。)


あなたがbindにそれらを覚えることなく、周りのメソッドを渡したい場合に必要である原型継承を放棄して喜んでいる場合は、その後、私の代わりにmodule patternをお勧め:

function TSt(val) { 
    // save a reference to our current "this" so that, even inside of methods 
    // called from other contexts, we still have it. 
    var that = this; 

    that.val = val; 
    that.func = function() { 
     return that.val * 2; 
     // Since we're using that instead of this, still works even without bind. 
    } 
} 

var tmp = new TSt(5); 
var other = tmp.func; 
console.log(other()); // 10 

は確かに、このパターンの別の主な利点は、あなたがプライベート変数を取得することができます:

function Encapsulated(mine, public) { 
    var that = this; 

    var private = mine * 2; 

    that.public = public; 
    that.compute = function() { 
     return that.public * private; 
    }; 
} 

Encapsulatedインスタンスのコンシューマは、mineまたはprivateにアクセスできないが、publicにしかアクセスできません。

+0

whoa、それは速かった。その解決策が働く。私の更新を見て、あなたの考えを知ってもらいたいと思いますか? –

+0

更新されたサンプルは動作しますが、 'tSt'のインスタンスごとに別々の' func'プロパティを作成しているので、プロトタイプの継承の利点が失われています。その 'func'はちょうど' tSt.prototype.func'に関連していますが、それは本当に無関係です。新しいインスタンスに固有のプロトタイプに継承された 'func'を呼び出した人はいないでしょう。言い換えれば、あなたのコードは 'this.func =(function(x){return x * 2}).Bind(this);'と同じです。 – Domenic

+0

意味がありますが、other.func.bind(tmp)ではなく 'other.func'を関数のパラメータとして単に渡すことができるようにするには、利益を失うことが必要です。助けてくれてありがとう。 –

関連する問題