2013-04-15 35 views
0

所以我知道我可以使用bind來修復我的模塊類的範圍,如this answer正確的語法來保存與上述原型的JavaScript上下文

唯一的問題是我對模塊使用了一個稍微不同的語法,我不太確定如何應用它?

那麼我的問題是,我如何正確應用綁定到我的函數,以便this的上下文是我的模塊?

代碼:

var module = (function() { 

    var module = function (name) { 

     this.getName= function() { 
      return name; 
     } 

    }; 

    module.prototype = { 

     something: function() { 
      // my function needs to access getName from here... 
     } 
    }; 

    return module; 
})(); 

用法:

var foo = module('nameValue'); 
foo.something(); 

回答

-1

您可能需要首先創建一個匿名函數,然後設置了別人,然後採用自參考模塊調用的getName()目的。

var module = function() { 

    var module = function(){}; 

    module.getName = function (name) { 
     return name; 
    }; 

    var self = module; 

    module.prototype.something = function() { 
     alert(self.getName('myName')); 
    }; 

    return module; 
}; 

var myMod = module(); 
myMod.prototype.something(); 

這裏的http://jsfiddle.net/ybfjB/

+0

你認爲myMod.prototype.something();是寫javascript的好方法嗎? –

+0

@KhanhTo在調用時,你不需要'.prototype'部分,它可能是一個意外(或未知) – Ian

+0

在上面的代碼中,name參數的用法是以整個模塊的構造函數的形式你的不支持 - 我更新使用。 – shenku

0

你確定使用申請而不是在這種情況下綁定不會是一個更好的實施活生生的例子?

如果您只是希望在模塊化設置中使類屬性可用於訪問,則需要在類函數聲明中公開它們。然後,他們將可以使用這些方法公開訪問。

var module = (function() { 

    function module (name) { 

     // public method exposing *name* variable with "privileged" access 
     this.getName= function() { 
      return name; 
     } 

     // publicly exposing *name* variable itself (ahh! It's naked!) 
     // this.name = name; // use only for read+write access to variable 

    }; 

    // only setting one prototype parameter here so let's save some lines... 
    module.prototype.something = function() { 

      return this.getName(); // or 
      // return this.name // for direct variable exposure 

    }; 

    return module; 
})(); 

然後你就可以創建實例:通過使用申請

var mod1 = new module("bar"); 
var mod2 = new module("foo"); 
var mod3 = new module("win"); 

,後來應用綁定...

雖然,你可以這樣做:

var getNameOfModule = function(){ return this.getName(); } 
getNameOfModule.apply(mod1); // bar 
getNameOfModule.apply(mod2); // foo 
getNameOfModule.apply(mod3); // win 


這完全取決於您的設置結構。


此外,這是很好的做法,有資本(如模塊與模塊)開始的類名稱。