Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Элитного кода тред (https://javascript.ru/forum/offtopic/57197-ehlitnogo-koda-tred.html)

Erolast 11.08.2015 17:17

Переписанный под синтаксис 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.

cyber 11.08.2015 17:22

Erolast, с каких пор setPrototypeOf попал в es5?

Erolast 11.08.2015 17:24

Цитата:

Erolast, с каких пор setPrototypeOf попал в es5?
На ES5 лишь синтаксис, окружение, естественно, нужно ES6 - прокси появились только в нем.
Почему бы не оставить из ES6 только прокси? У меня чет с использованием __proto__ в FF не заработало.

javaQest 11.08.2015 17:53

Цитата:

Функции в JS - те же настоящие объекты
это не относится как-бы, к делу. ну ладно, я вникну, получше, потом отпишусь. Только я не пойму, зачем эта клоунада? Почему надо использовать функции в качестве прототипов? это как то касается особенностей реализации, или что?

KosBeg 11.08.2015 17:54

РЕБЯТА! а часто тут у вас такие срачи бывают?
и еще вопрос - если на форуме есть троль, то вы его не сразу баните, а сначала мучаете? :lol:

javaQest 11.08.2015 17:55

Erolast,
Кстати, продублирую тут. Моя претензия по поводу затирания прототипа сабкласса остается в силе. Это не годится.

Erolast 11.08.2015 17:59

Цитата:

Только я не пойму, зачем эта клоунада? Почему надо использовать функции в качестве прототипов?
Ты о девятой строке? Это наследование статичных свойств класса, которые самому конструктору устанавливаются.

Цитата:

Сообщение от javaQest (Сообщение 383685)
Erolast,
Кстати, продублирую тут. Моя претензия по поводу затирания прототипа сабкласса остается в силе. Это не годится.

Я ж уже ответил:
Цитата:

Сообщение от Erolast (Сообщение 383682)
Ты хочешь наследовать в рантайме? Окей, поправил.
Просто я ж с ES6 переписывал, а там наследование устанавливается в момент объявления класса.


javaQest 11.08.2015 18:00

Erolast,
Кстати, (это так, не принципиально конечно, просто ремарочка) у тебя там логика страдает. Твой null в качестве обязательного аргумента там как пятое колесо выглядит. Получается, если null подан, то будет попытка наследования от прототипа null, смысл тогда в нем? Ну это так, к слову.

javaQest 11.08.2015 18:02

Цитата:

Сообщение от Erolast
Ты о девятой строке?

Я вот об этой строке
if (superClass) {
        Object.setPrototypeOf(subClass, superClass);
    }


почему не
if (superClass) {
        Object.setPrototypeOf(subClass.prototype, superClass.prototype);
    }

Erolast 11.08.2015 18:02

Цитата:

если null подан, то будет попытка наследования от прототипа null
Не будет, там же проверка делается:
Object.setPrototypeOf(subClass.prototype, *!*superClass*/!* && superClass.prototype);


Нет, я бы, конечно, расписал это в иф-элс, просто код установки наследования скопирован из бабеля (в котором он минифицирован) без рефакторинга.

javaQest 11.08.2015 18:04

Цитата:

Сообщение от Erolast
Ты хочешь наследовать в рантайме? Окей, поправил.
Просто я ж с ES6 переписывал, а там наследование устанавливается в момент объявления класса.

что ты поправил? ты по прежнему перезаписываешь прототип сабкласса.

Erolast 11.08.2015 18:05

Цитата:

Сообщение от javaQest (Сообщение 383692)
почему не
if (superClass) {
        Object.setPrototypeOf(subClass.prototype, superClass.prototype);
    }

Это уже сделано в 6-ой строке:
Цитата:

Object.setPrototypeOf(subClass.prototype, superClass && superClass.prototype);


Здесь статичные свойства наследуются.

Erolast 11.08.2015 18:05

Цитата:

Сообщение от javaQest (Сообщение 383694)
что ты поправил? ты по прежнему перезаписываешь прототип сабкласса.

Где?

javaQest 11.08.2015 18:06

Цитата:

Сообщение от Erolast
там же проверка делается:

делается. ты подал вторым аргументом null, проверку прошли, а дальше ты делаешь попытку сеттить subClass.prototype -- false
Object.setPrototypeOf(subClass.prototype, superClass && superClass.prototype);

я не помню, что будет, если прототипом ставишь false, но в любом случае, фигня.

javaQest 11.08.2015 18:09

Цитата:

Сообщение от Erolast
Где?

а, прошу прощения, ступил

Erolast 11.08.2015 18:11

Цитата:

ты подал вторым аргументом null, проверку прошли, а дальше ты делаешь попытку доступа к прототипу null
Не делается, потому что не проходит проверка, выделенная жирным шрифтом:
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);

javaQest 11.08.2015 18:30

Erolast,
Да, поспешил. Я, честно говоря и не знал, что null&&sоmething возвращает null, не логично это, сука

ну ладно, смотрим дальше.

javaQest 11.08.2015 18:33

Erolast,
А все таки, зачем это? Не проще ли, если нет второго валидного аргумента (ф-ции), сразу валить код. Ну подал ты нуль, и нахер он тебе там нужен?

javaQest 11.08.2015 18:51

Erolast,
короче, я пока твою первую ф-цию вот так переписал
inherits=function(subClass, superClass){
  if(!(typeof subClass==="function"&&typeof superClass==="function")) throw "typeERR"
  subClass.prototype.__proto__=superClass.prototype
}

суть та же, а говна меньше. "cтатические" св-ва нахер не упали, никакого наследования они не реализуют, это детсад

javaQest 11.08.2015 18:58

Erolast,
Да, и вот еще что. Ты все равно не прав, со своим нулем. Если ты подаешь нуль, в качестве второго аргумента, у тебя прототип прототипа субкласса перезаписывается нулем. Это непредсказуемое, и неадекватное поведение.

javaQest 11.08.2015 19:00

Erolast,
И кстати, че т я подумал, а какого хрена, ты вообще перезаписываешь прототип прототипа? Не факт, что там чего то не было до этого. Деструкция при множественном наследовании должна делаться явно. . Так что, не годен твой вариант.

Erolast 12.08.2015 07:48

Цитата:

Я, честно говоря и не знал, что null&&sоmething возвращает null, не логично это, сука
Такова особенность операторов || и && в JS: они возвращают не булево, а тот из операндов, который может быть приведен к требуемому булевому.

Цитата:

cтатические" св-ва нахер не упали
Поддержка статических свойств нужна для совместимости с классами ES6. Для себя ты можешь убрать этот код, но в моем примере он останется (он не только для тебя, все же).

Цитата:

Да, и вот еще что. Ты все равно не прав, со своим нулем. Если ты подаешь нуль, в качестве второго аргумента, у тебя прототип прототипа субкласса перезаписывается нулем. Это непредсказуемое, и неадекватное поведение.
Установка прототипа в null - это вполне себе классический, общеизвестный и даже прописанный в стандарте (http://www.ecma-international.org/ec...tionevaluation, пункт 6e) прием, использующийся для того, чтобы очистить объект от дефолтных методов, наследуемых из Object.prototype. А ты что, не знал?
Опять же, чисто для себя ты можешь наследование от null вырезать, но из примера я его убирать не буду.

Цитата:

И кстати, че т я подумал, а какого хрена, ты вообще перезаписываешь прототип прототипа? Не факт, что там чего то не было до этого. Деструкция при множественном наследовании должна делаться явно.
Чо? Прототип прототипа - это родитель. Функция inherits устанавливает (== меняет) родителя. Если у тебя класс уже наследовал от чего-то и ты решил функцией inherits назначить нового родителя, то перезапись его вполне логична.

И да, то, что в прототипе прототипа уже что-то было до этого - это факт. По умолчанию родителем любого класса является Object (Object.getPrototypeOf(Function.prototype) == Object.prototype).

javaQest 12.08.2015 09:35

Цитата:

Сообщение от Erolast
Чо? Прототип прототипа - это родитель. Функция inherits устанавливает (== меняет) родителя. Если у тебя класс уже наследовал от чего-то и ты решил функцией inherits назначить нового родителя, то перезапись его вполне логична.

И да, то, что в прототипе прототипа уже что-то было до этого - это факт. По умолчанию родителем любого класса является Object (Object.getPrototypeOf(Function.prototype) == Object.prototype).

объясняю популярно. У меня цепочка A->B->C->D->E, я захотел чтобы, E унаследовал от Z, сделав это, я потеряю, A->B->C, это разве не смешно? Мало того, ты неявно изменишь родителя D, и все классы и объекты, наследующие от D изменят свое поведение. Ты сам то веришь в бред, который ты несешь? Это очевидно даже школьнику. Зачем ты позоришься? Ну обосрался, признай ошибку, делов то.
Цитата:

Сообщение от Erolast
устанавливает (== меняет

устанавливать != менять
//fixed

ты должен дополнять в данном случае, ничего существующего не трогая и не ломая.

Остальные твои перделки меня не интересуют, есть они или нет, мне похеру, они роли не играют. Просто сделай мне то, на что ты подписался. Реализуй множественное наследование.

javaQest 12.08.2015 09:40

Цитата:

Сообщение от Erolast
Установка прототипа в null - это вполне себе классический, общеизвестный и даже прописанный в стандарте (http://www.ecma-international.org/ec...tionevaluation, пункт 6e) прием, использующийся для того, чтобы очистить объект от дефолтных методов, наследуемых из Object.prototype. А ты что, не знал?

Я тебе не про установку прототипа в нуль говорю, а про то, что ты под ковром, не совсем очевидным для пользователя образом, это делаешь, непонятно зачем. В контексте данной задачи это выглядит нелепостью. Это не нужно. Но можешь оставить, это принципиально ничего не меняет, только усложняет твою реализацию.

javaQest 12.08.2015 09:45

Цитата:

Сообщение от Erolast
И да, то, что в прототипе прототипа уже что-то было до этого - это факт

Естественно, я имел в виду что-то отличное от Object. Не надо тут строить непонимающие глазки. Ты может и глуп, но не настолько чтобы этого не понимать.

Erolast 12.08.2015 11:12

Цитата:

ты неявно изменишь родителя D, и все классы и объекты, наследующие от D изменят свое поведение.
С какой стати?

Цитата:

ты должен дополнять в данном случае, ничего существующего не трогая и не ломая.
Нет. Если функция называется inherits - значит, она должна перезаписывать. Чтобы добавлять родителя, надо, чтобы функция называлась addParent.
Энивей, это не имеет никакого отношения к реализации множественного наследования. Такое ощущение, что ты понял, что проигрываешь, и просто пытаешься увести разговор в сторону.

Цитата:

Реализуй множественное наследование.
Оно уже реализовано.

javaQest 12.08.2015 11:49

Цитата:

Сообщение от Erolast
С какой стати?

по определению. потому что ты перезаписал прототип.
Цитата:

Сообщение от Erolast
Оно уже реализовано.

почитай где-нибудь в умных книжках, что такое множественное наследование, посмотри различные реализации в других языках, а потом мы вернемся к этому разговору. Удачи.

javaQest 12.08.2015 11:58

Erolast,
Кстати, че то обезьяны не видно. ИМХО, это не справедливо, что ты один отдуваешься, это же фактически, его позор а не твой, ты хоть что-то попытался напейсать, а от него мы тут ни строки внятного кода не видали. Как только запахло жареным, он прижух, хотя веселые картиночки выкладывает.

javaQest 12.08.2015 12:00

Erolast,
Он наверное сидит, и проклинает тебя, за то что ты свою обфучкацию расшифровал, и народ узрел истину:)

javaQest 12.08.2015 12:05

Цитата:

Сообщение от Erolast
Если функция называется inherits - значит, она должна перезаписывать. Чтобы добавлять родителя, надо, чтобы функция называлась addParent.

LOL, значит все дело в названии? Ну назови addParent, я разрешаю.

javaQest 12.08.2015 12:10

Erolast,
Я кстати, дальше не читал, но непонятно, зачем тебе там понадобился Proxy? Такое говно как ты накалякал, можно и без него реализовать

trikadin 12.08.2015 12:19

javaQest, у вас уже два нарушения. Ещё одно -- и в бан на неделю.

javaQest 12.08.2015 12:20

trikadin,
А по поводу второго я не понял. Где было оскорбление?

trikadin 12.08.2015 12:22

Цитата:

Сообщение от javaQest
А по поводу второго я не понял. Где было оскорбление?

Цитата:

Сообщение от javaQest
Кстати, че то обезьяны не видно.

Это прямое. Плюс ещё много косвенных.

javaQest 12.08.2015 12:26

trikadin,
Так у него же это в аватаре, и под аватаром подпись. Значит, он сам так представился народу, мол, зовите меня так то и так то, а если назвать его так, значит это оскорбление? Чувствуется предвзятое отношение. Нехорошо.

Кстати, если поднять начало этого треда, там на меня столько грязи было вылито, и такими словами, что взрослый мужик покраснеет как девочка. Однако Вы там были, и Вас эта ситуация устраивала.

devote 12.08.2015 12:36

Цитата:

Сообщение от javaQest
Значит, он сам так представился народу, мол, зовите меня так то и так то

это у вас в голове мнение такое. Есть поговорка "Кто о чем думает, тот о том и говорит". На форуме у каждого участника есть никнейм, вот этим именем себя тут люди и называют, а не просят делать выводы из картинок и подписей.

Цитата:

Сообщение от javaQest
Кстати, если поднять начало этого треда, там на меня столько грязи было вылито

тебя в начале треда я не видел, ты появился с 9-й страницы этого треда, но если ты это tysonfury2015, то ...

javaQest 12.08.2015 12:37

Цитата:

Сообщение от devote
то ...

то что?

devote 12.08.2015 12:41

Цитата:

Сообщение от javaQest
то что?

ну я добрый модератор, поэтому меня нужно сильно разозлить что бы я кого-то отправил в бан. Но думаю trikadin, решит как правильнее с тобой поступить. А вообще в бан людей отправляют ума набираться, а вы вместо этого создаете новые аккаунты и продолжаете срать вместо того что бы включить в голове понимание и уважение к другим участникам форума.

javaQest 12.08.2015 12:45

devote,
Цитата:

Сообщение от devote
это у вас в голове мнение такое. Есть поговорка "Кто о чем думает, тот о том и говорит". На форуме у каждого участника есть никнейм, вот этим именем себя тут люди и называют, а не просят делать выводы из картинок и подписей.

так то оно так, но и оскорблением в чистом виде это нзвать нельзя. А учитывая контекст данного предупреждения, мотивация более чем очевидна. Фавориты данной модераторской персоны были слиты и опозорены, причем, на чисто объективном, техническом вопросе, поэтому, не имея возможности возразить по делу, он отомстил мне вот таким вот образом, что мол, не дергайся чувак, против толпы не попрешь, прав ты или не прав.

javaQest 12.08.2015 12:47

Цитата:

Сообщение от devote
в голове понимание и уважение к другим участникам форума.

Оно должно быть взаимным. Если Вы внимательно почитаете мои треды, вы обнаружите, что я никогда никого не оскорблял первым, только отвечал на оскорбления.


Часовой пояс GMT +3, время: 00:03.