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

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,
Да, и вот еще что. Ты все равно не прав, со своим нулем. Если ты подаешь нуль, в качестве второго аргумента, у тебя прототип прототипа субкласса перезаписывается нулем. Это непредсказуемое, и неадекватное поведение.


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