2011-11-06 80 views
1

嗨我正在使用此模块模式变体,并且正在寻找访问父对象的最佳方式。我意识到没有办法知道对象有什么父母,所以我想在构造函数中包含一些上下文。我认为这会起作用,但它不,有任何想法?在使用javascript模块模式变体时访问父对象

$(document).ready(function(){ 

    var main = new Main(); 

}); 


function Main() { 

    var one = 'hello'; 

    init(); 

    function init() { 
     var data = new Data(this); 
     var two = data.load(); 
     console.log(one+' '+two); 
     data.output(); 
    } 

} 

function Data(context) { 

    // public vars/methods 

    var pub = { 
     'load' : function() { 
      return ('world'); 
     }, 
     'output' : function() { 
      var one = context.one // <-- what should this be? 
      var two = this.load(); 
      console.log (one+' '+two); 
     } 
    } 

    return pub; 

} 

输出是:

hello world 
undefined world 

回答

2

当你调用与new运营商构造函数,你基本上是做一些像

function Main(){ 
    var this = //magic new object 
       //provided by the runtime 

    //your code comes here 

    return this; 
    //because your Data function returns a value, 
    // you never get to this line. Perhaps you should use 
    // a regular non-constructor data() function instead? 
} 

当你声明与var一个私有变量它将只是一个简单的变量,没有别的。如果您想要的东西添加到您this需要做这样明确地

this.one = 'hello'; 

但是,这还不是全部! this而不是词汇范围,所以init函数从外部获取与this无关的其他this(这解释了您获得的undefined)。当你想在内部函数中使用this你需要做一个变通方法,像:

var that = this; 

function init(){ 
    new Data(that); 
} 
init(); 

也就是说,只要你的榜样,我不明白为什么你需要做的这一切。只有在严格需要时(我想利用原型继承)时,我才喜欢使用构造函数(和new)。在你的情况下,也许你可以用“少OO”的方法逃脱?

​​
+0

谢谢你的回答,这是非常清楚,只是我以后。我同意我的例子不需要增加复杂性,我只是尽可能简单地展示模式。再次感谢! – pixelscript

相关问题