Переписанный под синтаксис 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); Нет, я бы, конечно, расписал это в иф-элс, просто код установки наследования скопирован из бабеля (в котором он минифицирован) без рефакторинга. |
Цитата:
|
Цитата:
Цитата:
Здесь статичные свойства наследуются. |
Цитата:
|
Цитата:
Object.setPrototypeOf(subClass.prototype, superClass && superClass.prototype); я не помню, что будет, если прототипом ставишь false, но в любом случае, фигня. |
Цитата:
|
Цитата:
Object.setPrototypeOf(subClass.prototype, *!*superClass*/!* && superClass.prototype); Цитата:
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);
}
}
var Class = function() {};
inherits(Class, null);
var instance = new Class();
console.log(instance);
|
Erolast,
Да, поспешил. Я, честно говоря и не знал, что null&&sоmething возвращает null, не логично это, сука ну ладно, смотрим дальше. |
Erolast,
А все таки, зачем это? Не проще ли, если нет второго валидного аргумента (ф-ции), сразу валить код. Ну подал ты нуль, и нахер он тебе там нужен? |
Erolast,
короче, я пока твою первую ф-цию вот так переписал
inherits=function(subClass, superClass){
if(!(typeof subClass==="function"&&typeof superClass==="function")) throw "typeERR"
subClass.prototype.__proto__=superClass.prototype
}
суть та же, а говна меньше. "cтатические" св-ва нахер не упали, никакого наследования они не реализуют, это детсад |
Erolast,
Да, и вот еще что. Ты все равно не прав, со своим нулем. Если ты подаешь нуль, в качестве второго аргумента, у тебя прототип прототипа субкласса перезаписывается нулем. Это непредсказуемое, и неадекватное поведение. |
Erolast,
И кстати, че т я подумал, а какого хрена, ты вообще перезаписываешь прототип прототипа? Не факт, что там чего то не было до этого. Деструкция при множественном наследовании должна делаться явно. . Так что, не годен твой вариант. |
Цитата:
Цитата:
Цитата:
Опять же, чисто для себя ты можешь наследование от null вырезать, но из примера я его убирать не буду. Цитата:
И да, то, что в прототипе прототипа уже что-то было до этого - это факт. По умолчанию родителем любого класса является Object (Object.getPrototypeOf(Function.prototype) == Object.prototype). |
Цитата:
Цитата:
//fixed ты должен дополнять в данном случае, ничего существующего не трогая и не ломая. Остальные твои перделки меня не интересуют, есть они или нет, мне похеру, они роли не играют. Просто сделай мне то, на что ты подписался. Реализуй множественное наследование. |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Энивей, это не имеет никакого отношения к реализации множественного наследования. Такое ощущение, что ты понял, что проигрываешь, и просто пытаешься увести разговор в сторону. Цитата:
|
Цитата:
Цитата:
|
Erolast,
Кстати, че то обезьяны не видно. ИМХО, это не справедливо, что ты один отдуваешься, это же фактически, его позор а не твой, ты хоть что-то попытался напейсать, а от него мы тут ни строки внятного кода не видали. Как только запахло жареным, он прижух, хотя веселые картиночки выкладывает. |
Erolast,
Он наверное сидит, и проклинает тебя, за то что ты свою обфучкацию расшифровал, и народ узрел истину:) |
Цитата:
|
Erolast,
Я кстати, дальше не читал, но непонятно, зачем тебе там понадобился Proxy? Такое говно как ты накалякал, можно и без него реализовать |
javaQest, у вас уже два нарушения. Ещё одно -- и в бан на неделю.
|
trikadin,
А по поводу второго я не понял. Где было оскорбление? |
Цитата:
Цитата:
|
trikadin,
Так у него же это в аватаре, и под аватаром подпись. Значит, он сам так представился народу, мол, зовите меня так то и так то, а если назвать его так, значит это оскорбление? Чувствуется предвзятое отношение. Нехорошо. Кстати, если поднять начало этого треда, там на меня столько грязи было вылито, и такими словами, что взрослый мужик покраснеет как девочка. Однако Вы там были, и Вас эта ситуация устраивала. |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
devote,
Цитата:
|
Цитата:
|
| Часовой пояс GMT +3, время: 18:02. |