2015-12-21 2 views
3

Моя проблема: у меня есть 2 внутренних объекта в моем классе js, и я пытаюсь использовать методы из одного из этих объектов в моем другом объекте (примеры того, что я пытаюсь сделать ниже). Я понимаю, почему это не работает из-за объема. Мне просто интересно, есть ли способ заставить его работать.Использование функций между внутренними объектными литералами в 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 'this' не является функцией. –

+0

Как отмечает Pointy, 'self: this' без рамки funciton дает вам что-либо,' 'это вне объекта, скорее всего' self' совпадает с 'window'. – adeneo

ответ

3

Вы можете исправить свой пример, заменив self с Class1. Строка self : this, устанавливает Class1.self, чтобы указать на глобальный объект (при оценке этой строки).

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

Смежные вопросы