Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 19.03.2014, 18:51
Интересующийся
Посмотреть профиль Найти все сообщения от Maxmaxmaximus11
 
Регистрация: 19.03.2014
Сообщений: 14

Сообщение от nerv_
правильней написать так
не, родительский конструктор виден будет по цепочке прототипов если он есть так что бакс не обязательно.

Сообщение от Sweet
Обрати внимание на название темы. С твоим подходом не получится многоуровневое наследование.
Почему? Ты имеешь ввиду нельзя делать цепочки классов? Ведь можно. К прапраметодам ты вообще можешь обратиться как $$methodName, если ты об этом) правда я не знаю зачем это может понадобиться.

Сообщение от nerv_
Нет той гибкости
ой а можно пример использования гибкости)? у нас по факту нет ни какого super обьекта) если что так. не к чему обращаться. у нас есть прототип в котором хранятся всякие функции. но это не super обьект) да и к томуже не правильно было бы из детей изменять методы суперкласса. имхо. родительский класс вот ДАЛ тебе кучу всего, вто что он дал ты можешь новое добавлять, но не менять или добавлять) это идеологически верно, даже по названию функции extend.

Сообщение от nerv_
то можно и миксыны сделать
это когда 2 конструктора применяешь к одному обьекту)?

Последний раз редактировалось Maxmaxmaximus11, 19.03.2014 в 18:57.
Ответить с цитированием
  #22 (permalink)  
Старый 19.03.2014, 19:31
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Maxmaxmaximus11
var A = Class.extend(function () {
  this.method = function () { }
});

var B = A.extend(function () {
  this.method = function () {
    this.$method == B.prototype.method; // -> fail!
  }
});

var C = B.extend(function () {
  this.method = function () {
    this.$method == B.prototype.method;
  }
});
Ответить с цитированием
  #23 (permalink)  
Старый 19.03.2014, 19:47
Интересующийся
Посмотреть профиль Найти все сообщения от Maxmaxmaximus11
 
Регистрация: 19.03.2014
Сообщений: 14



спасибо, баг нашел, короч влом фиксить, все ровно это ни кто юзать не будет. но мой способ поддерживает множественное наследование)

function Class(){

}

Class.extend = function (Prototype) {

    Prototype.prototype = this.prototype;
    constructor.prototype = new Prototype();
    constructor.extend = this.extend;

    
    function constructor() {
        if (this.constructor) {
            this.constructor.apply(this, arguments);
        }

        for (var key in this) if (this.hasOwnProperty(key) && /(^_)|(_$)/.test(key)) {
            Object.defineProperty(this, key, {
                value       : this[key],
                writable    : true,
                configurable: true,
                enumerable  : false
            });
        }
    }


    for (var key in constructor.prototype) if (constructor.prototype.hasOwnProperty(key)) {

        if (/(^_)|(_$)|(constructor)/.test(key)) {
            Object.defineProperty(constructor.prototype, key, {
                value       : constructor.prototype[key],
                writable    : true,
                configurable: true,
                enumerable  : false
            });
        }

        if (key in this.prototype && typeof this.prototype[key] === 'function') {
            Object.defineProperty(constructor.prototype, '$' + key, {
                value       : this.prototype[key],
                writable    : false,
                configurable: false,
                enumerable  : false
            });
        }

    }


    return constructor;
};

//#################################


var Animal = Class.extend(function () {
    this.say = function () {
        alert('Animal')
    }
});


var Cat = Animal.extend(function () {
    this.say = function () {
        this.$say();
        alert('Cat')
    }
});


var Ashot = Cat.extend(function () {
    this.say = function () {
        this.$say();
        alert('Ashot')
    }
});


new Ashot().say();
Ответить с цитированием
  #24 (permalink)  
Старый 19.03.2014, 19:48
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Maxmaxmaximus11
не, родительский конструктор виден будет по цепочке прототипов если он есть так что бакс не обязательно.
допустим, есть объект с методом, внутри которого вызывается супер метод
var obj = {
    method: function() {
        // тут этот объект вызывает свой супер метод
    }
};

С твоим подходом проблемы начнутся, если вызвать метод в контексте другого объекта. Т.е. "цепочка" супер методов в лучшем случае не будет вызвана, в худшем нарушена.
<script src="http://nervgh.github.io/js/yum/yum.js"></script>
<script>
    /**********************
     * CLASSES
     * *********************/

    /**
     * Class Animal
     * @param {Number} legs
     * @constructor
     */
    function Animal(legs) {}

    Animal.prototype.destroy = function() {
        console.log('Animal.destroy()');
    };

    // ------------------------

    // Inheritance
    Object.inherit(Mammal, Animal);

    /**
     * Class Mammal
     * @constructor
     */
    function Mammal(legs, teeth) {
        // call the Animal constructor
        Mammal.super_.apply(this, arguments);
    }

    Mammal.prototype.destroy = function() {
        console.log('Mammal.destroy()');
        Mammal.super_.prototype.destroy.call(this);
    };

    // ------------------------

    // Inheritance
    Object.inherit(Cat, Mammal);

    /**
     * Class Cat
     * @constructor
     */
    function Cat(legs, teeth, tails) {
        // call the Mammal constructor
        Cat.super_.apply(this, arguments);
    }

    Cat.prototype.destroy = function() {
        console.log('Cat.destroy()');
        Cat.super_.prototype.destroy.call(this);
    };


    /********************
     * USAGE / INSTANCE
     ********************/

    var cat = new Cat();

    cat.destroy(); // Cat -> Mammal -> Animal;
    console.log('--------------------');
    cat.destroy.call(this); // Cat -> Mammal -> Animal;

</script>


Сообщение от Maxmaxmaximus11
но мой способ поддерживает множественное наследование)
нет. Почему, читай тему.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 19.03.2014 в 19:53.
Ответить с цитированием
  #25 (permalink)  
Старый 19.03.2014, 19:52
Интересующийся
Посмотреть профиль Найти все сообщения от Maxmaxmaximus11
 
Регистрация: 19.03.2014
Сообщений: 14

ладно ладно) убедили, я просто щас другим занят)) наварганил прямо тут в текстэриа)
Ответить с цитированием
  #26 (permalink)  
Старый 19.03.2014, 20:04
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Цитата:
this.$method == B.prototype.method; // -> fail!
Sweet, все правильно, потому, что метод с баксом - это метод A.

var A = Class.extend(function () {
  this.method = function () { }
});

var B = A.extend(function () {
  this.method = function () {
    return this.$method === A.prototype.method;
  }
});

var C = B.extend(function () {
  this.method = function () {
    return this.$method === B.prototype.method;
  }
});
      

var b = new B();
var c = new C();
console.log(b.method());
console.log(c.method());
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 19.03.2014 в 20:09.
Ответить с цитированием
  #27 (permalink)  
Старый 19.03.2014, 20:24
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

nerv_, ты написал как должно быть, а я - как происходит при использовании реализации Class.extend Maxmaxmaximus11.
Ответить с цитированием
  #28 (permalink)  
Старый 19.03.2014, 20:35
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Sweet, я говорю, что "fail" происходит правильно в твоем примере.
Или я опять тебя не понял
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #29 (permalink)  
Старый 19.03.2014, 20:48
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

nerv_, Все всё поняли.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Множественное наследование - миф или реальность?! B~Vladi Оффтопик 109 04.09.2012 16:13