2017-01-03 10 views
9

Я знаю, что ES6 решил множество проблем, которые существовали с ключевым словом this в ES5, например функциями и классами стрелок.Почему «это» в классе ES6 не подразумевается?

Мой вопрос относится к использованию this в контексте класса ES6 и почему он должен быть написан явно. Я изначально был разработчиком Java, и я пришел из мира, где следующие строки кода были совершенно естественными.

class Person { 
    private String myName; 

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

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

Компилятор всегда будет относиться к значению поля myName, если он не имеет локальную переменную с именем myName, определенной в рамках метода.

Однако, как только мы превратим этот код ES6:

class Person { 

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

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

Это не будет работать, и он будет бросать Uncaught ReferenceError: myName is not defined. Единственный способ исправить это бросить в явном this ссылке:

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

Я понимаю необходимость this в конструкторе, поскольку классы ES6 не позволяют ваши поля должны быть определены вне конструктора, но я не понимаю, почему Javascript-двигатели не могут (или не будут, из-за стандарта) делать то же самое, что и Java-компиляторы, в случае sayMyName

+1

Итак, вы в основном спрашиваете, почему два в основном совершенно разных языка ведут себя по-другому? Обратите внимание, что «java» в «javascript» не имеет никакого отношения к языку программирования Java. – luk2302

+2

@ luk2302 - Если вы сказали, что языки в принципе не имеют отношения, это правда. Но когда вы говорите, что «java» в «javascript» не имеет никакого отношения к языку программирования Java », это неверно, поскольку вы можете проверить с помощью быстрого поиска Google. Из википедии: «... ** после получения лицензии на товарный знак от Sun **, было принято имя JavaScript. ** Это было скорее маркетинговым движением в то время, когда Java была очень популярна в то время **« –

+2

Not вы сравниваете только разные языки, но и разные понятия. _ «Я понимаю необходимость этого в конструкторе». Почему должна обрабатываться функция конструктора по-разному? – zeroflagL

ответ

5

Возможно, я не буду прямо отвечать на ваш вопрос, Попробую направить то, как вы должны думать о ключевом слове JS class.

Под крышкой нет никакой магии. В основном это синтаксический сахар над прототипным наследованием, которое было с самого начала JavaScript.

Чтобы узнать больше о классах в JS, нажмите here и here.

Из-за того, что вам нужно явно написать this, так это то, что в JS это всегда зависит от контекста, поэтому вы должны обратиться к точному объекту. Прочитано more.