Переписанный под синтаксис ES5 пример множественного наследования, специально для foo:
function inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } Object.setPrototypeOf(subClass.prototype, superClass && superClass.prototype); if (superClass) { Object.setPrototypeOf(subClass, superClass); } } function pluralParent() { var parents = [].slice.call(arguments); //Наследование конструктора var DerivativeParent = function() { var i; var Parent; for (i = 0; i < parents.length; i++) { Parent = parents[i]; Object.assign(this, new Parent()); } }; //Наследование свойств прототипа DerivativeParent.prototype = new Proxy(DerivativeParent.prototype, { get: function(target, name) { if (name in target) { return target[name]; } var i; var Parent; for (i = 0; i < parents.length; i++) { Parent = parents[i]; if (name in Parent.prototype) { return Parent.prototype[name]; } } } }); //Наследование статических свойств класса DerivativeParent = new Proxy(DerivativeParent, { get: function(target, name) { if (name in target) { return target[name]; } var i; var Parent; for (i = 0; i < parents.length; i++) { Parent = parents[i]; if (name in Parent) { return Parent[name]; } } } }); return DerivativeParent; } var Cat = function() { this.isACat = true; } Cat.prototype.meow = function() { console.log("meow"); } var Dog = function() { this.isADog = true; } Dog.prototype.bark = function() { console.log("woof"); } var CatDog = function() { //Вызвать родительский конструктор. Можно не вызывать - тогда установленные в конструкторах свойства не унаследуются. Object.getPrototypeOf(this.constructor).apply(this, arguments); }; inherits(CatDog, pluralParent(Cat, Dog)); var catDog = new CatDog(); catDog.meow(); catDog.bark(); console.log(catDog); Запускать надо в последнем FF (IceCat на дебиане): v8 еще не поддерживает вошедшие в релиз стандарта прокси ES6. |
Erolast, с каких пор setPrototypeOf попал в es5?
|
Цитата:
Почему бы не оставить из ES6 только прокси? У меня чет с использованием __proto__ в FF не заработало. |
Цитата:
|
РЕБЯТА! а часто тут у вас такие срачи бывают?
и еще вопрос - если на форуме есть троль, то вы его не сразу баните, а сначала мучаете? :lol: |
Erolast,
Кстати, продублирую тут. Моя претензия по поводу затирания прототипа сабкласса остается в силе. Это не годится. |
Цитата:
Цитата:
Цитата:
|
Erolast,
Кстати, (это так, не принципиально конечно, просто ремарочка) у тебя там логика страдает. Твой null в качестве обязательного аргумента там как пятое колесо выглядит. Получается, если null подан, то будет попытка наследования от прототипа null, смысл тогда в нем? Ну это так, к слову. |
Цитата:
if (superClass) { Object.setPrototypeOf(subClass, superClass); } почему не if (superClass) { Object.setPrototypeOf(subClass.prototype, superClass.prototype); } |
Цитата:
Object.setPrototypeOf(subClass.prototype, *!*superClass*/!* && superClass.prototype); Нет, я бы, конечно, расписал это в иф-элс, просто код установки наследования скопирован из бабеля (в котором он минифицирован) без рефакторинга. |
Часовой пояс GMT +3, время: 07:24. |