поддерживает ли JavaScript множественное наследование, например C ++ - PullRequest
3 голосов
/ 31 июля 2011

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

function fun1() {
this.var1=10;
this.meth1=function() {
...
...
};
}

function fun2() {
this.var2=20;
this.meth2=function() {
...
...
};
}

function fun3() {
this.var3=30;
this.meth3=function() {
...
...
};
}

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

fun3.prototype=new fun1();

или наследовать объект fun2, я могу сделать это

fun3.prototype=new fun2();

но как мне наследовать fun1 и fun2?

Ответы [ 4 ]

7 голосов
/ 31 июля 2011

Технически, JavaScript не предлагает множественное наследование. Каждый объект имеет четко определенный единственный объект-прототип и, следовательно, «цепочку прототипов».

Однако любой объект можно дополнить дополнительными методами, так называемыми "раскрытиями". Таким образом, вы можете перебрать коллекцию методов и по отдельности добавить их во вновь создаваемые объекты. Такая коллекция называется "миксин".

Несколько фреймворков предлагают миксины, например:

  • qooxdoo
  • ExtJS
  • MooTools
  • ...

Все они работают примерно одинаково.

Обратите внимание, что это не настоящее наследование, поскольку изменения в миксине не будут отражены в объектах.

Например:

var mixin = {
    method: function () {
        console.log('Hello world!');
    }
};
var foo = new fun1();
foo.method = mixin.method;
foo.method(); // Hello world!
mixin.method = function () { console.log('I changed!') };
foo.method(); // Hello world!
3 голосов
/ 31 июля 2011

Javascript поддерживает миксины, которые (на мой взгляд) лучше, чем множественное наследование C ++.Нужно изменить мышление по сравнению с C ++, чтобы оценить, насколько полезными могут быть миксины.Вы можете прочитать о них:

Свежий взгляд на Mixins

Wikipedia Mixins

Столько ссылок, сколько выхочу прочитать

1 голос
/ 31 июля 2011

Ну, вы могли бы просто иметь fun2 наследовать от fun1 для начала.

fun2.prototype = new fn1;

Если вышеперечисленное не работает для вас, то, к сожалению, вы не можете использовать множественное наследование. Вы можете скопировать свойства в новый объект, но тогда это не «живое» наследование.

Например:

func3.prototype = new fun1();
for(var i in func2.prototype)func3.prototype[i]=fun2.prototype[i];
1 голос
/ 31 июля 2011

Вот пример того, как это сделать:

http://www.amirharel.com/2010/06/11/implementing-multiple-inheritance-in-javascript/

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