2013-05-27 60 views
0

我正在使用子模塊模式代碼。想要創建具有對象文字的子模塊,問題是this,因爲子模塊內部的對象是MODULE而不是我的對象文字。任何想法?子模塊模式代碼中的對象文字和'this'

var MODULE.sub = (function() { 

    var myObject = { 

     key: value, 

     method: function() { 
      this.key // this = MODULE and not MyObject... :(
     } 

    }; 

    return myObject.method; 

}(MODULE)); 
+1

你如何創建和調用你的子模塊?更好的是,提供一個小提琴。 – HBP

+0

如果您將它稱爲'Module.sub.method()',那麼'Module.sub','myObject'和'this'內的'this'應該是同一個對象。 – Joseph

+0

小提琴:http://jsfiddle.net/jZVwv/2/ – Juan

回答

0

解決...只是返回一個MODULE.sub函數調用公共方法。我不知道,如果是最好的辦法

var MODULE.sub = (function() { 

    var myObject = { 

     key: value, 

     method: function() { 
      this.key // this = myObject :) 
     } 

    }; 

    return function() { 
     myObject.method(); 
    } 

}(MODULE)); 
+0

http://jsfiddle.net/jZVwv/3/小提琴 – Juan

0

這個工作對我來說:

var MODULE = MODULE || {}; 
MODULE.sub = (function() { 

    return { 

     myObject : { 

      key : 10, 

      method : function() { 
       console.log(this.key); 
      } 

     } 
    }; 

})(); 

然後調用它:

MODULE.sub.myObject.method(); 

你只返回方法,而不是鍵, 「本」 將是不確定的。你可以保持私人,如果你想要這樣,並通過密鑰作爲一個變種:

var MODULE = MODULE || {}; 
    MODULE.sub = (function() { 

     var key = 10, 

    return { 

     myObject : { 



      method : function() { 
       console.log(key); 
      } 

     } 
    }; 
})(); 
0

this keyword的價值取決於該函數是如何被調用。因此,如果您將該功能分配給MODULE.sub,然後將其調用爲MODULE.sub(…),那麼this當然會指向MODULE。如果您將其作爲myObject.method(…)調用,則this將指向該對象。

所以你要麼應該公開整個myObject(就像在@BingeBoys答案中),要麼不要導出該函數,並期望它是一個方法myObject。相反,你可以使用一個bound之一:

return myObject.method.bind(myObject); 

或者說

return function() { 
    return myObject.method(); 
}; 

明確等同不然你不會把功能method該對象上所有:

… 
    var myObject = { 
     key: value, 
    }; 
    return function() { 
     myObject.key // no `this` here 
     … 
    }; 
…