class Test {
constructor(name) {
this.name = name;
}
printHello(parameter) {
console.log(parameter);
}
testHello() {
this.printHello(this.name);
}
}
var test = new Test("Sandro");
test.printHello("hello"); //works, prints "Hello" to the Console
test.testHello(); // does not work: Reference Error: printHello is not defined
var test определен на глобальном уровне. Это возвращает объект, который содержит свойство name. В прототипах мы видим функции constructor, printHello и testHello. Теперь, когда вы вызываете //test.printHello//, это будет работать без проблем. Зачем? когда функция не на том же уровне, то она будет переходить к прототипам, пока не встретит функцию. В прототипе вы можете увидеть функцию printHello. Это вызов прототипа наследования.
Теперь, что происходит в //test.testHello()//. javaScript пытается выполнить это и увидеть другую функцию внутри этого. Поэтому он попытается найти, где определена эта функция printHello!
Теперь нам нужно знать о лексической среде. Проверьте этот образец,
var test = 'hello' ;
function foo(){
var test = 'world'
console.log(test)
}
Теперь, что произойдет, если вы вызовете foo ()? это будет console.log 'world',
Теперь я удаляю test var из функции
var test = 'hello' ;
function foo(){
console.log(test)
}
Теперь давайте вызовем foo (); На выходе будет 'привет'
- Когда функция выполняется, javascript пытается найти тестовую переменную. О, это на том же уровне. Другими словами, функциональный уровень. Теперь javaScript знает значение test, поэтому он будет выполнять console.log ();
- На этот раз javascript попытается найти тестовую переменную. ммм, это не внутри того же уровня. (функциональный уровень). Без проблем. Давайте посмотрим, где определена эта функция. О, это определено на глобальном уровне. Хорошо, теперь я найду этот тестовый вариант на глобальном уровне. ах, вот оно. его значение 'привет'
То же самое происходит с вашим кодом. Как только javascript пытается выполнить test.testHello (), он видит printHello () внутри этой функции. Теперь он попытается найти функцию на том же уровне. Он не определен ни в функции testHello (), ни внутри прототипов testHello (). Итак, теперь javaScript пытается выяснить, где определена эта функция testHello (). Это на глобальном уровне, потому что var test определяется на глобальном уровне. Определяется ли этот printHello () на глобальном уровне? НЕТ! Он находится внутри прототипа этого объекта. Теперь javaScript не может найти функцию printHello на глобальном уровне. Так что будет выдано сообщение об ошибке, что выражение printHello () не определено. Ключевое слово this поможет вам обратиться к объекту, которому оно принадлежит. Проще говоря, с помощью ключевого слова this, пожалуйста, проверьте прототип тестового объекта перед поиском на глобальном уровне. (обратите внимание, что не в прототипах testHello (), а в прототипе тестового объекта)
Важно понимать, что функции на самом деле не являются функциями. Это объекты в javaScript !!! Используйте ключевое слово this. Это поможет. Также попробуйте узнать о наследовании прототипа и лексической среде.