2014-01-20 47 views
0

比方說,我有以下代碼:如何在JavaScript中查找實例對象的初始創建者?

var Foo = (function() { 

    //constructor 
    var Foo = function (callbackFunction) { 
     this.callbackFunction = callbackFunction; 
    }; 

    //method 
    Foo.prototype = { 
     run: function() { 
      if (typeof(this.callbackFunction) === 'function') { 
       this.callbackFunction.call(???); //??? should be the object that created this Foo instance. 
      } 
     } 
    }; 
    return Foo; 
})(); 

,這是保存在foo.js

我也有下面的代碼:

var Bar = (function() { 

    //constructor 
    var Bar = function (v1, v2) { 
     this.v1 = v1; 
     this.v2 = v2; 
    }; 

    Bar.prototype.callback = function() { 
     //'this' should be the instance of Bar 
     console.log('value of v1 is ' + this.v1 + ' value of v2 is ' + this.v2); 
    } 

    Bar.prototype.callFoo = function() { 
     this.foo = new Foo(this.callback); 
     this.foo.run(); 
    } 

    return Bar; 
})(); 

var bar1 = new Bar('apple', 'orange'); 
bar1.callFoo(); 
var bar2 = new Bar('grape', 'banana'); 
bar2.callFoo(); 

再次,這裏面保存吧。 js

Foo裏面,我有這樣一行:this.callbackFunction.call(???);

因此,爲了做到這一點,我必須將創建Foo實例的對象傳遞給調用函數,但是如何實現?

+0

我想你應該刪除'prototype'。使用'Bar.callback'將[工作](http://jsfiddle.net/mGPf2/)。 – DontVoteMeDown

+0

難道你不能只在'this.foo.run(this);'中傳遞'this'作爲參數嗎? – basilikum

+1

@basilikum,我想我可以,但現在Bar創建Foo,我不知道讓foo和bar指向對方是不是一個好主意。這是我的擔心。 – Josh

回答

4

我的建議是使用function.bind()方法。

Mozilla開發者網絡:

的bind()方法創建一個新的功能,調用它時,有其 這個關鍵字設置爲所提供的值,與前面的任何設置時的 參數的給定序列新函數被調用。

這可能是很難找到一個辦法吧進入Foo.callbackFunction,但如果條經過在this.callbackFunction.bind(this),那麼富可以叫this.callbackFunction()沒有傳遞參數(或使用call

也有一些JavaScript庫允許您在舊版瀏覽器中執行此操作,因爲bind()是一個相對較新的功能。例如,在Dojo中,它叫做hitch()

+1

我想你的意思是'this.callback.bind(this)'?無論如何,好主意! – basilikum

+0

謝謝,這樣比較好。我已經替換了一行:this.foo = new Foo(this.callback);與this.foo = new Foo(this.callback.bind(this));那麼在Foo裏我可以調用this.callbackFunction.call();甚至this.callbackFunction(); – Josh

相關問題