Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #81 (permalink)  
Старый 11.08.2015, 17:17
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Переписанный под синтаксис 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, 11.08.2015 в 17:49.
Ответить с цитированием
  #82 (permalink)  
Старый 11.08.2015, 17:22
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Erolast, с каких пор setPrototypeOf попал в es5?
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #83 (permalink)  
Старый 11.08.2015, 17:24
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
Erolast, с каких пор setPrototypeOf попал в es5?
На ES5 лишь синтаксис, окружение, естественно, нужно ES6 - прокси появились только в нем.
Почему бы не оставить из ES6 только прокси? У меня чет с использованием __proto__ в FF не заработало.
Ответить с цитированием
  #84 (permalink)  
Старый 11.08.2015, 17:53
Профессор
Посмотреть профиль Найти все сообщения от javaQest
 
Регистрация: 07.08.2015
Сообщений: 154

Цитата:
Функции в JS - те же настоящие объекты
это не относится как-бы, к делу. ну ладно, я вникну, получше, потом отпишусь. Только я не пойму, зачем эта клоунада? Почему надо использовать функции в качестве прототипов? это как то касается особенностей реализации, или что?
Ответить с цитированием
  #85 (permalink)  
Старый 11.08.2015, 17:54
Аватар для KosBeg
Профессор
Отправить личное сообщение для KosBeg Посмотреть профиль Найти все сообщения от KosBeg
 
Регистрация: 22.05.2015
Сообщений: 384

РЕБЯТА! а часто тут у вас такие срачи бывают?
и еще вопрос - если на форуме есть троль, то вы его не сразу баните, а сначала мучаете?
Ответить с цитированием
  #86 (permalink)  
Старый 11.08.2015, 17:55
Профессор
Посмотреть профиль Найти все сообщения от javaQest
 
Регистрация: 07.08.2015
Сообщений: 154

Erolast,
Кстати, продублирую тут. Моя претензия по поводу затирания прототипа сабкласса остается в силе. Это не годится.
Ответить с цитированием
  #87 (permalink)  
Старый 11.08.2015, 17:59
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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

Сообщение от javaQest Посмотреть сообщение
Erolast,
Кстати, продублирую тут. Моя претензия по поводу затирания прототипа сабкласса остается в силе. Это не годится.
Я ж уже ответил:
Сообщение от Erolast Посмотреть сообщение
Ты хочешь наследовать в рантайме? Окей, поправил.
Просто я ж с ES6 переписывал, а там наследование устанавливается в момент объявления класса.
Ответить с цитированием
  #88 (permalink)  
Старый 11.08.2015, 18:00
Профессор
Посмотреть профиль Найти все сообщения от javaQest
 
Регистрация: 07.08.2015
Сообщений: 154

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

Сообщение от Erolast
Ты о девятой строке?
Я вот об этой строке
if (superClass) {
        Object.setPrototypeOf(subClass, superClass);
    }


почему не
if (superClass) {
        Object.setPrototypeOf(subClass.prototype, superClass.prototype);
    }
Ответить с цитированием
  #90 (permalink)  
Старый 11.08.2015, 18:02
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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


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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка 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