Доступ к переменным из наследуемых методов JavaScript - PullRequest
4 голосов
/ 15 февраля 2012

Я изучаю доступность переменных из методов, унаследованных от родительского объекта к дочернему объекту.

Наследование выполняется, связывая экземпляр родительского объекта с прототипом конструктора дочернего элемента:

Function.prototype.extend = function(child) {
    var prototype = new this;

    child.prototype = prototype;
    return child;
};

Итак, я определяю родительский класс:

var Parent = function() {
    var self = this;

    this.init = function() {
        self.name = 'Abram';
    };
    this.getName = function() {
        alert('self.name = ' + self.name);
    };
    this.init();
};

и детский класс:

var Baby = Parent.extend(function(name) {
    var self = this;

    this.init = function() {
        self.name = name;
    };
    this.init();
});

// instantiate a child object:
var baby = new Baby('Jimmy');

// call the inherited method:
baby.getName(); // undefined!

Метод getName правильно унаследован, но он не имеет доступа к члену self.name.
Как получится, если он доступен в области экземпляра дочернего класса?

Проверка тела метода с помощью alert(baby.getName) Я получаю:

function () {
    alert("self.name = " + self.name);
}

это именно то, что я ожидал.
Но почему он не разрешает переменную self локально?

1 Ответ

3 голосов
/ 15 февраля 2012

Переменная «self» в родительской функции «getName ()» ссылается на экземпляр parent .Функция «init» в дочернем объекте устанавливает имя для этого объекта, а не объекта-прототипа.

Таким образом:

  1. var baby = new Baby("Jimmy"); приводит к объекту со свойством «name»установлен в строку "Jimmy"
  2. baby.getName(); вызывает функцию объекта-прототипа, поскольку у объекта "baby" нет свойства "getName".Внутри этой функции делается ссылка на переменную «self», которая ссылается на этот объект-прототип - , а не на объект «baby».Для объекта-прототипа не установлено свойство "name".

Посмотрите, что произойдет, если вы измените функцию .getName() в прототипе, чтобы использовать this.name вместо self.name.

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