对象文字和子模块中的'this'

时间:2013-05-27 04:17:50

标签: javascript module-pattern

我在子模块模式代码中工作。想要创建具有对象文字的子模块,问题是this对于子模块内的对象是MODULE而不是我的对象文字。有什么想法吗?

var MODULE.sub = (function () {

   var myObject = {

       key: value,

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

   };

   return myObject.method;

}(MODULE));

3 个答案:

答案 0 :(得分:0)

这对我有用:

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

   return {

       myObject : {

           key : 10,

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

       }
   };

})();

然后叫它:

MODULE.sub.myObject.method();

您只返回方法而不是键,因此“this”将是未定义的。如果您想这样,可以将其保密,并将密钥作为var:

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

      var key = 10,

   return {

       myObject : {



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

       }
   };
})();

答案 1 :(得分:0)

解决了......只需在MODULE.sub中返回一个调用public方法的函数。我不知道是否是最好的方法

var MODULE.sub = (function () {

   var myObject = {

       key: value,

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

   };

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

}(MODULE));

答案 2 :(得分: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
        …
    };
…