Дочерние классы перезаписывают методы друг друга - PullRequest
1 голос
/ 10 августа 2011

благодаря помощи от плакатов stackoverflow я настроил некоторые oav javascript. Однако я столкнулся с еще одной загадкой.

У меня есть два разных класса с одинаковым наследованием. Затем они оба имеют одинаковую функцию, но делают разные вещи. Проблема в том, что если ClassB определен последним, то даже когда у меня есть объект ClassA, и напишите classAInstance.MyFunction (); он возвращает 2, то есть функцию ClassB с тем же именем.

BaseClass = function(){
    ...init some stuff...
};

ClassA = function(){
    BaseClass.call(this);
    ...init some stuff...
};
ClassA.prototype = BaseClass.prototype; // innherit
ClassA.prototype.MyFunction(){
    return 1;
};

ClassB = function(){
    BaseClass.call(this);
    ...init some stuff...
};
ClassB.prototype = BaseClass.prototype; // innherit
ClassB.prototype.MyFunction(){
    return 2;
}

Ответы [ 5 ]

3 голосов
/ 10 августа 2011

Причина в том, что и ClassA, и прототип ClassB указывают на один и тот же объект.Я не уверен, каков ваш вариант использования для этого, но было бы также хорошо, чтобы прототип был экземпляром.

ClassA.prototype = new BaseClass();

...

ClassB.prototype = new BaseClass();
2 голосов
/ 10 августа 2011

Ваша проблема в том, что объекты передаются по ссылке, а не по значению!

(Ну, на самом деле, технически это по значению, но для аргументов это значение является ссылкой).

Дело в том, что когда вы устанавливаете ClassA.prototype.myFunction, вы определяете новую функцию в прототипе BaseClass, потому что помните ClassA.prototype = BaseClass.prototype.

Итак, когда вы устанавливаете ClassB.prototype.myFunction, вы снова перезаписываете BaseClass.prototype.myFunction, а затем впоследствии функцию вашего ClassA!

0 голосов
/ 10 августа 2011

Вы неправильно настраиваете прототип новых классов

BaseClass = function(){
    ...init some stuff...
};

ClassA = function(){
    BaseClass.call(this);
    ...init some stuff...
};
ClassA.prototype = new BaseClass(); // innherit
ClassA.prototype.MyFunction(){
    return 1;
};

ClassB = function(){
    BaseClass.call(this);
    ...init some stuff...
};
ClassB.prototype = new BaseClass(); // innherit
ClassB.prototype.MyFunction(){
    return 2;
};
0 голосов
/ 10 августа 2011

Есть много способов выполнить наследование в JS. Проблема, с которой вы сталкиваетесь, заключается в том, что все три класса фактически одинаковы, потому что они all ссылаются на объект в BaseClass.prototype.

Одним из коротких способов наследования от простого базового класса является использование:

ClassA.prototype = new BaseClass();

и

ClassB.prototype = new BaseClass();

Это распадется на более классные классы (то есть классы, которые включают параметры) для конструктора. Я помню, что у Дугласа Крокфорда была функция, которую можно использовать для создания более изощренной версии расширения, однако в настоящее время я не могу ее найти.

0 голосов
/ 10 августа 2011

Обычно вам бы не хотелось иметь две функции с одинаковыми именами в любой сети объектов, которые вложены или наследуются друг от друга. Почему бы не переименовать второй MyFunction(){ во что-то еще?

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