2016-05-22 31 views
5

Czytam, nie wiem. JS: ES6 & Dalej i ja natknąłem się na ten fragment w dziale Symbol.species.Co to oznacza w tym fragmencie kodu?

class Cool { 
 
    // defer `@@species` to derived constructor 
 
    static get [Symbol.species]() { return this; } 
 

 
    again() { 
 
     return new this.constructor[Symbol.species](); 
 
    } 
 
} 
 

 
class Fun extends Cool {} 
 

 
class Awesome extends Cool { 
 
    // force `@@species` to be parent constructor 
 
    static get [Symbol.species]() { return Cool; } 
 
} 
 

 
var a = new Fun(), 
 
    b = new Awesome(), 
 
    c = a.again(), 
 
    d = b.again(); 
 

 
c instanceof Fun;   // true 
 
d instanceof Awesome;  // false 
 
d instanceof Cool;   // true

Wydaje się, że Symbol.species funkcyjnych} {return Coś zawsze powinien zwrócić funkcji konstruktora. Ale w pierwszej obecności tej funkcji: static get [Symbol.species]() { return this; } Jestem zdezorientowany, ponieważ zawsze uważam, że powinien to być obiekt zamiast funkcji konstruktora. Czy możesz mi pomóc wyjaśnić fakty?

Co do tego, o czym tutaj mowa?

Odpowiedz

5

this będzie odwoływać się do czegoś innego wewnątrz metody w zależności od kontekstu, w jakim została wykonana.

W metodach klas, metody statyczne, this będą odnosić się do klasy.

Tak na przykład z

static get [Symbol.species]() { return this; } 

ponieważ jest to metoda klasy, będzie wykonywany jest na klasie i this skieruje do klasy

//since this is a getter we don't use trailing `()` 
Cool[Symbol.species] === Cool; 
//It does not exist on instances 
var myCool = new Cool(); 
console.log(myCool[Symbol.species]); 
//will give undefined 

teraz na metodach instancji, podobnie jak again metoda, istnieją tylko w instancji i dlatego wywoływane są z instancji, a nie z klasy:

console.log(Cool.again); 
//will give undefined 
var myCool = new Cool(); 
var newInstance = myCool.again(); 

Na przykład metody this odnoszą się do instancji, a nie do klasy.

Wziąwszy pod uwagę:

return new this.constructor[Symbol.species](); 
  • this jest wystąpienie (np new Cool)
  • this.constructor jest konstruktor utworzony wystąpienie (np Cool)
  • this.constructor[Symbol.species] jest metoda klasy gettera Symbol.species
  • new this.constructor[Symbol.species]() to nowa instancja klasa, która Symbol.species zwróciła

Tak więc cała linia zwraca nową instancję klasy, którą zwraca metoda statycznego gettera Symbol.species.

Pozwala to klasie na stosowanie metod tworzenia nowych wystąpień danej klasy bez znajomości jej nazwy.

Więc jak widać na powyższym przykładzie, mimo Fun nigdy zdefiniowane To własne again metodę again wie, jak utworzyć nową instancję Fun. I jak pokazuje Awesome, możesz po prostu przesłonić Symbol.species, aby zmienić, która instancja zostanie utworzona przez instancję again.