2017-01-03 21 views
9

Wiem, że ES6 rozwiązał wiele problemów, które istniały ze słowem kluczowymw ES5, takie jak funkcje strzałek i klasy.Dlaczego "to" w klasie ES6 nie jest ukryte?

Moje pytanie dotyczy użycia this w kontekście klasy ES6 i dlaczego musi być napisane wprost. Początkowo byłem programistą Java i pochodzę ze świata, w którym poniższe linie kodu były całkowicie naturalne.

class Person { 
    private String myName; 

    public Person() { 
    myName = "Heisenberg"; 
    } 

    public void sayMyName() { 
    System.out.println("My name is " + myName); 
    } 
} 

Kompilator będzie zawsze odnoszą się do wartości pola myName, chyba że posiada lokalną zmienną o nazwie myName zdefiniowanej w zakresie metody.

Jednak, gdy możemy przekształcić ten kod do ES6:

class Person { 

    constructor() { 
    this.myName = "Heisenberg"; 
    } 

    sayMyName() { 
    console.log(`My name is ${myName}`); 
    } 
} 

To nie będzie działać i będzie rzucić Uncaught ReferenceError: myName is not defined. Jedynym sposobem, aby naprawić to, aby rzucić się w wyraźnej this odniesienia:

console.log(`My name is ${this.myName}`) 

Rozumiem potrzebę this w konstruktorze klasy ES6 ponieważ nie pozwalają na twoje pola, które zostaną określone na zewnątrz konstruktora, ale nie rozumiem, dlaczego silniki JavaScript nie mogą (lub nie, ze względu na standard) zrobić to samo, co kompilatory Java, może w przypadku sayMyName

+1

W zasadzie pytacie, dlaczego dwa w większości zupełnie inne języki zachowują się inaczej? Zauważ, że "java" w "javascript" nie ma nic wspólnego z językiem programowania Java. – luk2302

+2

@ luk2302 - Jeśli powiedziałeś, że języki w zasadzie nie mają związku, to prawda. Ale kiedy mówisz "java" w "javascript" nie ma nic wspólnego z językiem programowania Java ", to jest fałszywe, ponieważ możesz to sprawdzić za pomocą szybkiego wyszukiwania w Google. Z Wikipedii: "... ** po otrzymaniu licencji od Sun **, przyjęto nazwę JavaScript. ** To był pewien ruch marketingowy w tamtym czasie, ponieważ Java jest bardzo popularna w tym czasie **" –

+2

Nie tylko porównujesz różne języki, ale także różne koncepcje. _ "Rozumiem potrzebę tego w konstruktorze" _ Dlaczego funkcja konstruktora powinna być obsługiwana inaczej? – zeroflagL

Odpowiedz

5

Może nie będę bezpośrednio odpowiadać na twoje pytanie, ale ja " Spróbuję nakierować sposób, w jaki powinieneś pomyśleć o słowach kluczowych JS class.

Pod przykryciem nie ma żadnej magii. Zasadniczo jest to cukier syntetyczny nad dziedziczeniem prototypowym, który był od początku JavaScript.

Aby dowiedzieć się więcej o klasach w JS, kliknij here i here.

Z tego powodu należy jawnie napisać: this jest to, że w JS jest zawsze wrażliwy na kontekst, więc powinieneś odnieść się do dokładnego obiektu. Przeczytaj more.

Powiązane problemy