2015-12-21 54 views
3

我的問題是我在我的js類中有2個內部對象,我試圖從其他對象中的一個對象使用方法(我想要的例子以下做)。我明白爲什麼因爲範圍而不起作用。我只是想知道是否有辦法讓它工作。javascript內部對象文字之間的函數使用

var Class1 = { 

    self : this, 
    Obj1 : { 

     Obj1Method : function() { 
      alert("Do something"); 
     }, 
     Obj1Method2 : function() { 
      alert("Do something else"); 
     }, 

     InnerObj1 : { 
      InnerNestObj1Method : function (val) { 
       alert(val + 2); 
      } 
     } 
    }, 

    Class1Method2 : function() { 
     this.Obj1.Obj1Method2(); 
    }, 

    Obj2 : { 

     Obj2Method : function (val2) { 
      self.Obj1.InnerObj1.InnerNestObj1Method(val2); 
     }, 

     Obj2Method2 : function() { 
      self.Class1Method2(); 
     } 
    } 
}; 

Class1.Obj1.InnerObj1.InnerNestObj1Method(3); //works 
Class1.Class1Method2(); //works 
Class1.Obj2.Obj2Method2(); //No bueno 
Class1.Obj2.Obj2Method(5); //No bueno 
+1

'self'屬性的值不會**爲對'Class1'的引用。無論this的值是否在對象初始值設定項的外部。 – Pointy

+1

@Liam'這個'不是功能。 –

+0

正如Pointy所指出的那樣,「self:this'沒有函數作用域給出了這個對象之外的任何東西,很可能'self'和'window'是一樣的。 – adeneo

回答

3

您可以通過Class1更換self解決您的例子。 行self : this,Class1.self設置爲指向全局對象(當評估該行時爲this)。

var Class1 = { 
 

 
    self : this, 
 
    Obj1 : { 
 

 
     Obj1Method : function() { 
 
      alert("Do something"); 
 
     }, 
 
     Obj1Method2 : function() { 
 
      alert("Do something else"); 
 
     }, 
 

 
     InnerObj1 : { 
 
      InnerNestObj1Method : function (val) { 
 
       alert(val + 2); 
 
      } 
 
     } 
 
    }, 
 

 
    Class1Method2 : function() { 
 
     this.Obj1.Obj1Method2(); 
 
    }, 
 

 
    Obj2 : { 
 

 
     Obj2Method : function (val2) { 
 
      Class1.Obj1.InnerObj1.InnerNestObj1Method(val2); 
 
     }, 
 

 
     Obj2Method2 : function() { 
 
      Class1.Class1Method2(); 
 
     } 
 
    } 
 
}; 
 

 
Class1.Obj1.InnerObj1.InnerNestObj1Method(3); //works 
 
Class1.Class1Method2(); //works 
 
Class1.Obj2.Obj2Method2(); //bueno 
 
Class1.Obj2.Obj2Method(5); //bueno

當你做self: this

// If this is running in non strict mode, from the global scope, `this` points 
// To the global object because there was no function call setting `this` 
var Class1 = { 
    self : this, 
}; 

你需要明白會發生什麼事是this是誰使用所謂的this功能設置。在上面的示例中,沒有調用者,因此運行時將this設置爲指向全局對象。

這裏是你怎麼可以,你可以讓你的對象多一點可重複使用的,並給自己的外部對象的引用:

function createClass() { 
 
    var self = { 
 
    Obj1: { 
 

 
     Obj1Method: function() { 
 
     alert("Do something"); 
 
     }, 
 
     Obj1Method2: function() { 
 
     alert("Do something else"); 
 
     }, 
 

 
     InnerObj1: { 
 
     InnerNestObj1Method: function(val) { 
 
      alert(val + 2); 
 
     } 
 
     } 
 
    }, 
 

 
    Class1Method2: function() { 
 
     self.Obj1.Obj1Method2(); 
 
    }, 
 

 
    Obj2: { 
 

 
     Obj2Method: function(val2) { 
 
     self.Obj1.InnerObj1.InnerNestObj1Method(val2); 
 
     }, 
 

 
     Obj2Method2: function() { 
 
     self.Class1Method2(); 
 
     } 
 
    } 
 
    }; 
 
    return self; 
 
} 
 

 
var Class1 = createClass(); 
 

 
Class1.Obj1.InnerObj1.InnerNestObj1Method(3); //works 
 
Class1.Class1Method2(); //works 
 
Class1.Obj2.Obj2Method2(); //works 
 
Class1.Obj2.Obj2Method(5); //works

+0

謝謝教給我一些新東西。 –

0

你可以用Classes做到這一點:

"use strict" 
 
class Class1 { 
 
    constructor() { 
 
    this.Obj1 = { 
 
     Obj1Method: function() { 
 
     alert("Do something"); 
 
     }, 
 
     Obj1Method2: function() { 
 
     alert("Do something else"); 
 
     }, 
 

 
     InnerObj1: { 
 
     InnerNestObj1Method: function(val) { 
 
      alert(val + 2); 
 
     } 
 
     } 
 
    }; 
 
    
 
    var self = this; 
 
    this.Obj2 = { 
 
     Obj2Method: function(val2) { 
 
     self.Obj1.InnerObj1.InnerNestObj1Method(val2); 
 
     }, 
 

 
     Obj2Method2: function() { 
 
     self.Class1Method2(); 
 
     } 
 
    }; 
 
    } 
 

 
    Class1Method2() { 
 
    this.Obj1.Obj1Method2(); 
 
    } 
 

 
}; 
 

 
var c1 = new Class1(); 
 
c1.Obj1.InnerObj1.InnerNestObj1Method(3); //works 
 
c1.Class1Method2(); //works 
 
c1.Obj2.Obj2Method(3); //works 
 
c1.Obj2.Obj2Method2(); //works

相關問題