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

Цитата:
Ясно, что он нормально работать не будет.
Да ну? А у ведь работает) Странно...

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);

//Добавление методов в рантайме: научим пса (и, соответственно, котопса) рычать
Dog.prototype.growl = function() {
    console.log("Rrrrrrr");
}
catDog.growl();
Ответить с цитированием