2017-10-17 5 views
0

(veuillez noter que ceci n'est pas une question en double, voir la réponse de @Jeff M ci-dessous)Comment utiliser la composition avec les classes es6 de la même manière que cet exemple utilise les fonctions d'usine?

J'essaie de comprendre la syntaxe de la classe es6. Je veux composer mes cours de la même manière que ce code n'utilisant les fonctions d'usine:

Exemple 1:

const barker = (state) => ({ 
    bark:() => console.log("Woof, I am " + state.name) 
}); 

const driver = (state) => ({ 
    drive:() => state.position = state.position + state.speed 
}); 

const murderRobotDog = (name) => { 
    let state = { 
    name, 
    speed: 100, 
    position: 0 
    }; 
    return Object.assign({}, 
    barker(state), 
    driver(state) 
); 
}; 

const bruno = murderRobotDog("bruno"); 
bruno.bark(); // "Woof, I am Bruno" 

Mon exemple de travail de composition de classe en utilisant la « classe » d'un tutoriel complètement différent se présente comme suit :

Exemple 2:

class Employee { 
    constructor(firstName, familyName) { 
    this._firstName = firstName; 
    this._familyName = familyName; 
    } 

    getFullName() { 
    return `${this._firstName} ${this._familyName}`; 
    } 
} 

class Group { 
    constructor(manager /* : Employee */) { 
    this._manager = manager; 
    this._managedEmployees = []; 
    } 

    addEmployee(employee) { 
    this._managedEmployees.push(employee); 
    } 
} 

Je peux voir comment le concept de composition fonctionne, mais ceux-ci semblent comme façons très différentes de le faire. Le premier exemple utilisant les usines semble le plus intuitif, mais je veux utiliser la syntaxe de classe es6 (ne vous inquiétez pas pourquoi :)

Peut-être qu'il me manque quelque chose et la réponse est évidente, mais comment ferais-je exactement quoi est fait dans l'exemple 1 en utilisant les classes es6 de la manière la plus simpliste? MERCI.

+0

double possible de [ES6 classe héritage multiple] (https://stackoverflow.com/questions/29879267/es6-class-multiple-inheritance) – lilezek

Répondre

0

Je peux voir que vous utilisez l'exemple "composition" de MPJ, donc la première chose que vous devez savoir est que MPJ got composition completely wrong. Ce que MPJ effectivement a démontré (sans qu'il se rende compte) était l'héritage multiple. C'est pourquoi quelqu'un a déjà signalé votre question comme une copie possible d'une autre question d'héritage multiple.

La chaîne de prototypes de JavaScript ne prend en charge qu'un seul héritage, et comme les classes ES6 utilisent la chaîne du prototype, elles ne prennent en charge qu'un seul héritage. Mais avec a little trick, nous pouvons néanmoins obtenir le même effet que l'héritage multiple.

Il se présenter comme suit:

const barker = Sup => class extends Sup { 
    bark() { console.log("Woof, I am " + this.name) } 
} 

const driver = Sup => class extends Sup { 
    drive() { this.position = this.position + this.speed } 
}; 

class murderRobotDog extends driver(barker(Object)) { 
    constructor(name) { 
     super(); 
     this.name = name; 
     this.speed = 100; 
     this.position = 0; 
    } 
}; 

const bruno = new murderRobotDog("bruno"); 
bruno.bark(); // "Woof, I am Bruno" 
+0

OMG Merci !! Cela fait des semaines que je m'interroge, je peux à peine croire que mon héros MPJ a tort, mon monde est détruit! J'ai lu le lien vers le forum, mais tous les exemples ne sont plus dans JS. Pourriez-vous m'aider une fois de plus et me montrer comment faire l'exemple MPJ en utilisant la composition PROPER dans les classes ES6? – Sumomo

+0

La composition utilise des variables d'instance qui sont des références à d'autres objets. Comme ceci https://pastebin.com/Edqg9ZvX –