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
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
@ 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 **" –
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