Доступ к переменной экземпляра из родительской функции - PullRequest
3 голосов
/ 24 декабря 2011

У меня есть объект, который наследуется от другого.В дочернем объекте я инициализирую некоторые переменные экземпляра.В родительском объекте у меня есть метод, который вызывает частные функции, которые используют эти переменные экземпляра.

function objA() {
  this.funcA = function() {
    alert(this.var);
    funcB();
  };
  function funcB() {
    alert(this.var);
  };
}

objB.prototype = new objA();
objB.prototype.constructor = objB;
function objB() {
  this.var ="hello";
  this.funcA();
}

первое предупреждение дает «привет», второе неопределенное ...

I константачто «this» в javascript - это идентификатор объекта, вызывающего функцию, а не сам экземпляр ... Я предполагаю, что при вызове funcB я нахожусь в каком-то родительском контексте, где переменная не существует ...

Я чистый новичок в javascript, и я не могу понять, как это решить.Конечно, я мог бы передать это как вспомогательное средство, но это не очень ООП, и в моем проекте есть намного больше переменных, чтобы сделать доступными ...

Спасибо

Ответы [ 3 ]

1 голос
/ 24 декабря 2011

Пожалуйста, не злоупотребляйте способностью JavaScript определять функции после их использования. Очень трудно читать такой код.

Как вы заметили, проблема не в вашей цепочке наследования, а в том, как вы хотите получить доступ к this из функции funcB. Вызов функции с помощью foo() отличается от вызова obj.foo() или this.foo(). Значение this зависит от того, как вы вызываете функцию. Когда вы сделаете obj.foo() this будет obj. Но если вы позвоните foo(), значением this будет объект window.

Вы можете изменить значение this внутри функции, используя Function.prototype.call и Function.prototype.apply, поэтому пишите foo.call(obj) (теперь this будет obj). Имея это в виду, ваш код будет выглядеть так:

function objA() {
  function funcB() {
    alert(this.var);
  }
  this.funcA = function() {
    alert(this.var);
    funcB.call(this); // <- notice .call()
  };
}

function objB() {
  this.var ="hello";
  this.funcA();
}
objB.prototype = new objA();
objB.prototype.constructor = objB;

Также следует помнить, что имена свойств не могут быть зарезервированными словами (например, «var») в старых браузерах.

1 голос
/ 24 декабря 2011

Когда функция вызывается как funcB () , внутри функции ' это ' будет объектом Window.Поэтому обычно для объекта используется прокси-переменная.Ниже вы можете увидеть, как это сделать.

function objA() {

  var _this;

  this.super = function(){
    _this = this;  
  }

  this.funcA = function() {
    alert(this.var);
    funcB();
  };

  function funcB() {
    alert(_this.var);
  };
}

objB = function objB() {
  this.super();
  this.var ="hello";
  this.funcA();
}

objB.prototype = new objA();

var b = new objB();
0 голосов
/ 24 декабря 2011

Используя наследование на основе прототипов, вы не можете получить доступ к свойствам, объявленным в дочернем элементе, из родительского элемента.Пожалуйста, смотрите это руководство для разработчиков от Mozilla:

https://developer.mozilla.org/en/JavaScript/Guide/Inheritance_constructor_prototype и, в частности, там, где говорится:

"Поиск свойств следует цепочке прототипов. Все объекты, которые имеют общую цепочку прототиповподелиться общими свойствами. "

Дочерний элемент разделяет всю " общую цепочку прототипов "с родителем, но не наоборот.Это не означает, что не может быть других способов выполнить то, что вы пытаетесь, однако наследование на основе прототипа может быть не таким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...