Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Множественное наследование, супер методы, наследование дескрипторов (https://javascript.ru/forum/offtopic/45583-mnozhestvennoe-nasledovanie-super-metody-nasledovanie-deskriptorov.html)

Maxmaxmaximus11 19.03.2014 18:51

Цитата:

Сообщение от nerv_
правильней написать так

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

Цитата:

Сообщение от Sweet
Обрати внимание на название темы. С твоим подходом не получится многоуровневое наследование.

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

Цитата:

Сообщение от nerv_
Нет той гибкости

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

Цитата:

Сообщение от nerv_
то можно и миксыны сделать

это когда 2 конструктора применяешь к одному обьекту)?

Sweet 19.03.2014 19:31

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

Maxmaxmaximus11 19.03.2014 19:47



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

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

nerv_ 19.03.2014 19:48

Цитата:

Сообщение от 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
но мой способ поддерживает множественное наследование)

нет. Почему, читай тему.

Maxmaxmaximus11 19.03.2014 19:52

ладно ладно) убедили, я просто щас другим занят)) наварганил прямо тут в текстэриа)

nerv_ 19.03.2014 20:04

Цитата:

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

Sweet 19.03.2014 20:24

nerv_, ты написал как должно быть, а я - как происходит при использовании реализации Class.extend Maxmaxmaximus11.

nerv_ 19.03.2014 20:35

Sweet, я говорю, что "fail" происходит правильно в твоем примере.
Или я опять тебя не понял :)

Sweet 19.03.2014 20:48

nerv_, :) Все всё поняли.


Часовой пояс GMT +3, время: 12:05.