2017-02-15 47 views
8

W klasie ES6 z niektórymi zmiennymi i metodami instancji, jak dodać do niej mixin? Podałem przykład poniżej, choć nie wiem, czy składnia obiektu mixin jest poprawna.Jak dodać mixiny do klas javascript ES6?

class Test { 
    constructor() { 
    this.var1 = 'var1' 
    } 
    method1() { 
    console.log(this.var1) 
    } 
    test() { 
    this.method2() 
    } 
} 

var mixin = { 
    var2: 'var2', 
    method2: { 
    console.log(this.var2) 
    } 
} 

Jeśli biegnę (new Test()).test(), to nie dlatego, że nie ma method2 na klasy, jak to jest w wstawek, dlatego muszę dodawać zmienne i metody wstawek do klasy.

Widzę, że istnieje funkcja "mieszanka" z domieszką https://lodash.com/docs/4.17.4#mixin, ale nie wiem, w jaki sposób mogę jej użyć z klasami ES6. Nie mam nic przeciwko używaniu aplikacji lodash do rozwiązania lub nawet zwykłego JS bez bibliotek, aby zapewnić funkcjonalność mixin.

+0

http://justinfagnani.com/2015/12/21/real-mixins-with-javascript-classes/ – zloctb

Odpowiedz

13

System obiektów/właściwości JavaScript jest znacznie bardziej dynamiczny niż większość języków, więc bardzo łatwo dodać funkcjonalność do obiektu. Ponieważ funkcje są pierwszymi obiektami, można je dodać do obiektu dokładnie w ten sam sposób. Object.assign to sposób dodawania właściwości jednego obiektu do innego obiektu. (Jego zachowanie jest pod wieloma względami porównywalne z _.mixin.)

Klasy w JavaScript to tylko cukier syntaktyczny, który sprawia, że ​​dodawanie pary konstruktorów/prototypów jest łatwe i przejrzyste. Funkcjonalność nie zmieniła się z kodu sprzed ES6.

Możesz dodać obiekt do prototypu:

Object.assign(Test.prototype, mixin); 

Można dodać go w konstruktorze do każdego obiektu Utworzono:

constructor() { 
    this.var1 = 'var1'; 
    Object.assign(this, mixin); 
} 

Można dodać go w konstruktorze na podstawie warunku :

constructor() { 
    this.var1 = 'var1'; 
    if (someCondition) { 
     Object.assign(this, mixin); 
    } 
} 

Lub możesz przypisać go do obiektu po jego utworzeniu:

let test = new Test(); 
Object.assign(test, mixin); 
+1

@ user779159 Ten facet zrozumiał. Po prostu spróbuj tego, co proponuje. –

+0

@lonesomeday Jaka jest różnica między dodaniem go do prototypu do samego obiektu? Myślałem, że deklarując metody lepiej jest zrobić to na prototypie, ponieważ wtedy wszystkie obiekty mają tę samą funkcję, a nie wszystkie mają swoje własne funkcje, które robią to samo. Czy dotyczy to również tej techniki miksowania, w której bardziej efektywne jest zastosowanie jej do prototypu niż obiektu? – user779159

+1

@ user779159 Funkcja będzie istnieć tylko raz. Dopiero, gdy ponownie zadeklarujesz funkcję, zostanie utworzona druga funkcja. (Np. Jeśli masz funkcję dekoratora, która tworzy nową funkcję za każdym razem, gdy jest uruchamiana.) – lonesomeday

1

Powinieneś prawdopodobnie spojrzeć na Object.assign(). Musi wyglądać tak:

Object.assign(Test.prototype, mixin); 

To sprawi, że wszystkie metody i właściwości z mixin zostaną skopiowane do obiektu prototypowego Test konstruktora.

+0

Czy istnieje sposób, aby zadzwonić, że od obrębie 'class' się? – user779159

+0

Jest to wysoce wątpliwe. Dzieje się tak dlatego, że klasy ES6 są po prostu cukrem syntaktycznym ukrywającym dobre prototypowe dziedzictwo. Są więc w zasadzie uproszczonymi funkcjami konstruktora. –