Наследование прототипа JavaScript - PullRequest
1 голос
/ 15 июля 2011

Я пытаюсь наследовать методы одного объекта в другой.

У меня есть базовый объект, который реализован с использованием шаблона модуля выявления .

Page = function(url) {
    ...
    return { something: something_I_defined_above }
    ...
}

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

Link = function() {
   this.add = function() {}

   var instance = this;

   Link = function() { return instance; }
}

Далее я хочу, чтобы Page наследовал от ссылки.

Page.prototype = new Link();

При тестировании этого кода я получаю неопределенное значение для функции p

var p = new Page();
// The following line return undefined.
p.add;

1 Ответ

3 голосов
/ 15 июля 2011

Вы никогда не создаете экземпляр объекта Page. Все, что вы делаете, это возвращаете обычный объектный литерал при вызове

Page = function(url) {
    ...
    return { something: something_I_defined_above }
    ...
}

var p = new Page();

Этот литерал не наследуется от Page.prototype. Есть несколько способов решить эту проблему, в основном в зависимости от того, как вы хотите структурировать свое приложение.

Например, вместо того, чтобы Page наследовать от Link (имеет ли это смысл?), Вы можете вернуть объект, который наследуется от Link:

Page = function(url) {
    ...
    var Constr = function(){};
    Constr.prototype = new Link();
    var instance = new Constr();
    instance.something = something_I_defined_above;

    return instance;
    ...
}

var p = new Page();

Я на самом деле не уверен, что будет лучшим подходом здесь. Это действительно зависит от того, что вы хотите. Мое предложение не сделало бы его слишком сложным.

...