Mam doświadczenie z C # i Java, ale próbuję nauczyć się JavaScript / Node.js. Nie mogę dowiedzieć się, jaki jest problem z tym kodem.

Mam więc plik main.js i ma ten kod:

const MyClass = require("./MyClass");
let myclass = new MyClass("my string!");

myclass.repeatString();

Calling MyClass ma ten kod:

class MyClass {
    constructor(myString) {
        this.myString = myString;
    }

    repeatString() {
        console.log(myString);
    }
}

module.exports = MyClass;

Kiedy próbuję to uruchomić, otrzymuję ReferenceError: myString is not defined, gdy próbuję wykonać tę metodę repeatString(). Co robię źle / jaki jest właściwy sposób?

2
Andrio 5 lipiec 2017, 08:40

5 odpowiedzi

Najlepsza odpowiedź

W przeciwieństwie do niektórych języków takich jak Java, gdzie możemy referencyjne zmienne w klasie bez użycia {X1}}, this Binding zachowuje się znacznie inaczej w JavaScript, podobnie jak zakres.

W Javie jest to legalne:

class Test {
  int i;
  void method() {
    System.out.print(i); // <-- Java compiler knows to look for the `i` on the class instance (technically it first looks for `i` locally in the scope of `method` and the goes to look on the class)
  }
}

W JavaScript, nie mamy tego zachowania, nie ma czegoś takiego jak zmienna klasowa (jeszcze).

class Test {
  i; // <-- Uncaught SyntaxError: Unexpected token ;
  method() {
    console.log(i);
  }
}

Dla twojego przykładu oznacza to, że zawsze jesteś zobowiązany do użycia this podczas odwoływania zmiennych obecnych w klasie (technicznie w instancji obiektu).

W ten sposób musisz użyć this.myString:

repeatString() {
  console.log(this.myString);
}

Dostajesz Reference Error, ponieważ silnik stara się znaleźć zmienną o nazwie myString, począwszy od zakresu repeatString i w górę i nie ma żadnego. Jedynym zakresem, który ma zmienną myString, jest ten w funkcji konstruktora, a ten zakres jest nieosiągalny z repeatString.

Klasy w języku JavaScriptowym są radykalnie innym (Oto przegląd) niż Java, nawet jeśli składnia wygląda bardzo podobny.

5
nem035 27 luty 2018, 17:42

Dostęp do zmiennej członka klasy w JavaScript można uzyskać za pomocą składni Ta.Member-zmienna

Prawidłowy sposób rozwiązania problemu następuje:

Main.js

const MyClass = require("./MyClass");
let myclass = new MyClass("my string!");
myclass.repeatString();

MyClass.js.

class MyClass {
    constructor(myString) {
        this.myString = myString;
    }

    repeatString() {
        console.log(this.myString);
    }
}

module.exports = MyClass;
0
Abhay Kumar 5 lipiec 2017, 08:01

Aby uzyskać dostęp do zmiennej klasy, użyj this. nazwa zmiennej.

Sprawdź poniższy kod.

class MyClass {
    constructor(myString) {
        this.myString = myString;
    }

    repeatString() {
        console.log(this.myString);
    }
}

const myClass = new MyClass('Hello');
myClass.repeatString();
1
Hassan Imam 5 lipiec 2017, 06:13

Aby wydrukować String Variable Użyj console.log(this.myString);

1
Naveen Kerati 5 lipiec 2017, 06:02

Aby wskazać, że odnosi się do właściwości obiektu o nazwie {x0}} zamiast zmiennej o tej samej nazwie, wywołanie console.log() powinno być przeczytane:

console.log(this.myString);
1
Robby Cornelissen 5 lipiec 2017, 05:45