2015-04-14 2 views
0

Возможно, мне не ясно, с чем связано название вопроса. Простите за это.Как получить доступ к переменным класса из внутреннего прототипа - javascript

Вот что я хотел сделать.

Я пытаюсь использовать шаблон прототипирования в javascript. Я создал класс следующим образом.

var MyClass = null; 
(function() { 
    MyClass = function() { 
     this.clsVar = "I'm inside constructor"; 
    }; 

    MyClass.prototype = { 
     constructor: MyClass, 
     myFunc1: function() { 
      console.log("I'm func1 accessing constructor variable : " + this.clsVar); 
     }, 
     nested: { 
      myFunc2: function() { 
       console.log("I'm func2 accessing constructor variable : " + this.clsVar); // I know, this will never point to the class scope 
      } 
     } 
    } 
}()) 

Я создаю объект.

var my = new MyClass(); 

my.myFunc1(); // which prints "I'm func1 accessing constructor variable : I'm inside constructor" 

my.nested.myFunc1(); // as expected, it prints "I'm func2 accessing constructor variable : undefined 

Все, что я пытаюсь сделать, это, я должен быть в состоянии получить доступ clsVar из nested.myFunc2

это возможно.? Любая помощь приветствуется и необходима. Спасибо.

ответ

1

Собственно, есть пункт.

this внутри вашего myFunc2 больше не ссылается на MyClass, но в другом контексте. Таким образом, самый быстрый способ это сделать, это использовать call или apply как:

var myNewObject = new MyClass(); 
myNewObject.nested.myFunc2.call(myNewObject, arg1, arg2); 

или

myNewObject.nested.myFunc2.apply(myNewObject, [arg1, arg2]); 
0

прототип на базе системы класса в JavaScript не позволяет этого. Прототип MyClass будет использоваться для всех экземпляров класса. В следующем коде, оба экземпляр будет использовать один и тот же экземпляр функции ...

var first = new MyClass(), second = new MyClass(); 
first.nested.myFunc2(); <-- Same prototype function 
seecond.nested.myFunc2(); <-- Same prototype function 

Когда код входит в определение «myFunc2», который родитель он должен быть доступ?

Если вам нужен доступ к значению этого «родителя», вам нужно будет использовать закрытие и настроить вложенный объект в родительском конструкторе, как показано ниже.

var MyClass = null; 

(function() { 
    MyClass = function() { 
     this.clsVar = "I'm inside constructor"; 
     var that = this; 
     this.nested = { 
      myFunc2: function() { 
       console.log("I'm func2 accessing constructor variable : " + that.clsVar); // I know, this will never point to the class scope 
      } 
     } 
    }; 

    MyClass.prototype = { 
     constructor: MyClass, 
     myFunc1: function() { 
      console.log("I'm func1 accessing constructor variable : " + this.clsVar); 
     } 
    } 
}()) 
Смежные вопросы