2015-12-21 55 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

相关问题