Проблема наследования JavaScript - PullRequest
3 голосов
/ 25 августа 2010

Я не могу правильно переписать методы класса, используя следующий код ...

function core() {
    console.log( "CORE CONSTRUCTOR CALLED" );
}

core.prototype.output = function() {
    return 'CORE';
}

function sub1() {
    console.log( "SUB 1 CONSTRUCTOR CALLED" );
    this.core();
}

sub1.prototype = core.prototype;
sub1.prototype.constructor = sub1;
sub1.prototype.core = core;

sub1.prototype.output = function() {
    return 'SUB 1';
}

function sub2() {
    console.log( "SUB 2 CONSTRUCTOR CALLED" );
    this.core();
}

sub2.prototype = core.prototype;
sub2.prototype.constructor = sub2;
sub2.prototype.core = core;

sub2.prototype.output = function() {
    return 'SUB 2';
}

var oCore = new core();
var oSub1 = new sub1();
var oSub2 = new sub2();

console.log( oCore.output() );
console.log( oSub1.output() );
console.log( oSub2.output() );

... я получаю следующий вывод ...

CORE CONSTRUCTOR CALLED
SUB 1 CONSTRUCTOR CALLED
CORE CONSTRUCTOR CALLED
SUB 2 CONSTRUCTOR CALLED
CORE CONSTRUCTOR CALLED
SUB 2
SUB 2
SUB 2

Что я делаю не так?

1 Ответ

4 голосов
/ 25 августа 2010

Проблема в том, что ... при выдаче строки:

sub2.prototype = core.prototype;

Вы используете один и тот же прототип на sub2 как core, поэтому при вызове .output() из ЛЮБОГО классов функция на core.prototype.output является версией sub2 это последний определенный. Помните, что назначение объектов происходит по ссылке.

Чтобы скопировать объект, который вы обычно видите:

sub2.prototype = new core();
sub2.prototype.core = core;

Или - если вы хотите избежать вызова конструктора, вы можете использовать jQuery $.extend(sub1.prototype, core.prototype);, чтобы скопировать основной прототип. Если у вас нет jQuery, это примерно так же:

sub2.prototype = {};
for (var method in core.prototype) sub2.prototype[method] = core.prototype[method];
sub2.prototype.constructor = core;
sub2.prototype.core = core;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...