11.08.2015, 18:04
|
Профессор
|
|
Регистрация: 07.08.2015
Сообщений: 154
|
|
Сообщение от Erolast
|
Ты хочешь наследовать в рантайме? Окей, поправил.
Просто я ж с ES6 переписывал, а там наследование устанавливается в момент объявления класса.
|
что ты поправил? ты по прежнему перезаписываешь прототип сабкласса.
|
|
11.08.2015, 18:05
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Сообщение от javaQest
|
почему не
if (superClass) {
Object.setPrototypeOf(subClass.prototype, superClass.prototype);
}
|
Это уже сделано в 6-ой строке:
Цитата:
|
Object.setPrototypeOf(subClass.prototype, superClass && superClass.prototype);
|
Здесь статичные свойства наследуются.
Последний раз редактировалось Erolast, 11.08.2015 в 18:07.
|
|
11.08.2015, 18:05
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Сообщение от javaQest
|
что ты поправил? ты по прежнему перезаписываешь прототип сабкласса.
|
Где?
|
|
11.08.2015, 18:06
|
Профессор
|
|
Регистрация: 07.08.2015
Сообщений: 154
|
|
Сообщение от Erolast
|
там же проверка делается:
|
делается. ты подал вторым аргументом null, проверку прошли, а дальше ты делаешь попытку сеттить subClass.prototype -- false
Object.setPrototypeOf(subClass.prototype, superClass && superClass.prototype);
я не помню, что будет, если прототипом ставишь false, но в любом случае, фигня.
Последний раз редактировалось javaQest, 11.08.2015 в 18:15.
|
|
11.08.2015, 18:09
|
Профессор
|
|
Регистрация: 07.08.2015
Сообщений: 154
|
|
Сообщение от Erolast
|
Где?
|
а, прошу прощения, ступил
|
|
11.08.2015, 18:11
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Цитата:
|
ты подал вторым аргументом 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);
|
|
11.08.2015, 18:30
|
Профессор
|
|
Регистрация: 07.08.2015
Сообщений: 154
|
|
Erolast,
Да, поспешил. Я, честно говоря и не знал, что null&&sоmething возвращает null, не логично это, сука
ну ладно, смотрим дальше.
|
|
11.08.2015, 18:33
|
Профессор
|
|
Регистрация: 07.08.2015
Сообщений: 154
|
|
Erolast,
А все таки, зачем это? Не проще ли, если нет второго валидного аргумента (ф-ции), сразу валить код. Ну подал ты нуль, и нахер он тебе там нужен?
|
|
11.08.2015, 18:51
|
Профессор
|
|
Регистрация: 07.08.2015
Сообщений: 154
|
|
Erolast,
короче, я пока твою первую ф-цию вот так переписал
inherits=function(subClass, superClass){
if(!(typeof subClass==="function"&&typeof superClass==="function")) throw "typeERR"
subClass.prototype.__proto__=superClass.prototype
}
суть та же, а говна меньше. "cтатические" св-ва нахер не упали, никакого наследования они не реализуют, это детсад
|
|
11.08.2015, 18:58
|
Профессор
|
|
Регистрация: 07.08.2015
Сообщений: 154
|
|
Erolast,
Да, и вот еще что. Ты все равно не прав, со своим нулем. Если ты подаешь нуль, в качестве второго аргумента, у тебя прототип прототипа субкласса перезаписывается нулем. Это непредсказуемое, и неадекватное поведение.
|
|
|
|