Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #91 (permalink)  
Старый 11.08.2015, 18:04
Профессор
Посмотреть профиль Найти все сообщения от javaQest
 
Регистрация: 07.08.2015
Сообщений: 154

Сообщение от Erolast
Ты хочешь наследовать в рантайме? Окей, поправил.
Просто я ж с ES6 переписывал, а там наследование устанавливается в момент объявления класса.
что ты поправил? ты по прежнему перезаписываешь прототип сабкласса.
Ответить с цитированием
  #92 (permalink)  
Старый 11.08.2015, 18:05
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 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.
Ответить с цитированием
  #93 (permalink)  
Старый 11.08.2015, 18:05
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Сообщение от javaQest Посмотреть сообщение
что ты поправил? ты по прежнему перезаписываешь прототип сабкласса.
Где?
Ответить с цитированием
  #94 (permalink)  
Старый 11.08.2015, 18:06
Профессор
Посмотреть профиль Найти все сообщения от javaQest
 
Регистрация: 07.08.2015
Сообщений: 154

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

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

Последний раз редактировалось javaQest, 11.08.2015 в 18:15.
Ответить с цитированием
  #95 (permalink)  
Старый 11.08.2015, 18:09
Профессор
Посмотреть профиль Найти все сообщения от javaQest
 
Регистрация: 07.08.2015
Сообщений: 154

Сообщение от Erolast
Где?
а, прошу прощения, ступил
Ответить с цитированием
  #96 (permalink)  
Старый 11.08.2015, 18:11
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 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);
Ответить с цитированием
  #97 (permalink)  
Старый 11.08.2015, 18:30
Профессор
Посмотреть профиль Найти все сообщения от javaQest
 
Регистрация: 07.08.2015
Сообщений: 154

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

ну ладно, смотрим дальше.
Ответить с цитированием
  #98 (permalink)  
Старый 11.08.2015, 18:33
Профессор
Посмотреть профиль Найти все сообщения от javaQest
 
Регистрация: 07.08.2015
Сообщений: 154

Erolast,
А все таки, зачем это? Не проще ли, если нет второго валидного аргумента (ф-ции), сразу валить код. Ну подал ты нуль, и нахер он тебе там нужен?
Ответить с цитированием
  #99 (permalink)  
Старый 11.08.2015, 18:51
Профессор
Посмотреть профиль Найти все сообщения от javaQest
 
Регистрация: 07.08.2015
Сообщений: 154

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

суть та же, а говна меньше. "cтатические" св-ва нахер не упали, никакого наследования они не реализуют, это детсад
Ответить с цитированием
  #100 (permalink)  
Старый 11.08.2015, 18:58
Профессор
Посмотреть профиль Найти все сообщения от javaQest
 
Регистрация: 07.08.2015
Сообщений: 154

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка HTML кода и JS кода через innerHTML zhurchik AJAX и COMET 1 31.10.2014 17:32
Как визуализировать структуру кода? dkudrin Общие вопросы Javascript 2 22.08.2014 19:12
скрыть из исходного кода часть javascript кода. javasc Javascript под браузер 10 12.03.2014 09:32
Удаление участка кода replace Dorian_bs Общие вопросы Javascript 3 23.11.2012 23:19
Пример кода сохранения в базу html страницы генерированного посредством JavaScripts wayzer Серверные языки и технологии 2 06.09.2012 16:46