Héritage multiple

Commentaires

  1. WOW! merci beaucoup, super article, clair et instructif! 🙂

    J’ai un petit souci, quand je fait:


    const Drawable = function(superclass) {
    return class extends superclass {
    draw() {
    console.log(this.width, this.height);
    }
    };
    };

    class Shape {
    constructor(w, h) {
    this.width = w;
    this.height = h;
    }

    setWidth(w) {
    this.width = w;
    }

    setHeight(h) {
    this.height = h;
    }
    }

    class Rectangle extends Drawable(Shape) {
    constructor(w, h) {
    super(w, h);
    }

    getArea() {
    return this.width * this.height;
    }
    }

    const r = new Rectangle(5, 10);
    console.log(r.__proto__);
    console.log(r.__proto__.__proto__);
    console.log(r.__proto__.__proto__.__proto__);
    console.log(r.__proto__.__proto__.__proto__.__proto__);

    J’obtiens en console:


    Rectangle {}
    Shape {}
    Shape {}
    {}

    Du coup ca respecte pas trop le schema 🙁
    J’aurai voulu obtenir:


    Rectangle { constructor: [Function: Rectangle], getArea: [Function] }
    Drawable { constructor: [Function: Drawable], draw: [Function] }
    Shape { setWidth: [Function], setHeight: [Function] }
    {}

    Que j’ai reussi avec la vielle method:


    const Shape = function(w, h) {
    this.width = w;
    this.height = h;
    };

    Shape.prototype.setWidth = function(w) {
    this.width = w;
    };

    Shape.prototype.setHeight = function(h) {
    this.height = h;
    };

    const drawable = function(superclass) {
    const Drawable = function(w, h) {
    superclass.call(this, w, h);
    };

    Drawable.prototype = Object.create(Shape.prototype);

    Drawable.prototype.constructor = Drawable;

    Drawable.prototype.draw = function() {
    return console.log(this.width, this.height);
    };

    return Drawable;
    }

    const Rectangle = function(w, h) {
    drawable(Shape).call(this, w, h);
    };

    Rectangle.prototype = Object.create(drawable(Shape).prototype);

    Rectangle.prototype.constructor = Rectangle;

    Rectangle.prototype.getArea = function() {
    return this.width * this.height;
    };

    const r = new Rectangle(5, 10);
    console.log(r.__proto__);
    console.log(r.__proto__.__proto__);
    console.log(r.__proto__.__proto__.__proto__);
    console.log(r.__proto__.__proto__.__proto__.__proto__);

    Comment je peux obtenir le meme resultat via es6?
    Pourquoi en utilisant le mot clef class il me sort juste Rectangle {} par exemple sans les methodes de Rectangle?

    Merci beaucoup beaucoup 🙂

    1. Tu as essayé sur quel navigateur ? Car le code ES6 est correct, j’obtiens bien :


      { constructor: ƒ, getArea: ƒ }
      {constructor: ƒ, draw: ƒ }
      { constructor: ƒ, setWidth: ƒ, setHeight: ƒ }
      { constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ,  … }

        1. Je sais pas sur quel navigateur tu testes mais il se mouille pas { constructor: ƒ, getArea: ƒ }, il prenne pas le risque d ecrire en sorti {constructor: Rectangle, getArea: f} 😂

      1. OK 🙂 j’ai trouver mon probleme. En es6 je n’avais pas donner de nom de classe a Drawable. Du coup:

        const drawable = function(superclass) {
        return class Drawable extends superclass {
        draw() {
        console.log(this.width, this.height);
        }
        };
        };

        Ainsi j’obtiens bien

        Rectangle { }
        Drawable { }
        Shape { }
        {}

        Le probleme qu’il reste c’est qu’en mode « non es6 » j’obtiens:

        Rectangle { constructor: [Function: Rectangle], getArea: [Function] }
        Drawable { constructor: [Function: Drawable], draw: [Function] }
        Shape { setWidth: [Function], setHeight: [Function] }
        {}

        La raison est plus simple que prevu, lorsqu’on cree une class es6, le descripteurs enumerable est false par default, si je veux le meme resultat il me faudra (pour Shape mais pour Rectangle et Drawable aussi):


        const Shape = function(w, h) {
        this.width = w;
        this.height = h;
        };
        Object.defineProperties(Shape.prototype, {
        setWidth: {
        value: function(w) {
        this.width = w;
        },
        enumerable: true
        },
        setHeight: {
        value: function(h) {
        this.height = h;
        },
        enumerable: true
        }
        })

        Pour obtenir:


        Rectangle { }
        Drawable { }
        Shape { }
        {}

        🙂 🙂

Post a Comment

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.