Java和JavaScript中类的区别是什么?

3
我可以帮您翻译相关的IT技术内容,以下是需要翻译的文本:

我有一些C#和Java的经验,但我正在尝试学习javascript/node.js。 我无法弄清楚这段代码的问题所在。

因此,我有一个名为main.js的文件,它包含以下代码:

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

myclass.repeatString();

被调用的MyClass类中有以下代码:

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

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

module.exports = MyClass;

当我尝试运行这个程序时,它会报错ReferenceError: myString is not defined,并在执行repeatString()方法时出现此错误。我做错了什么/应该怎么做才对?

5个回答

6

与一些像Java这样的语言不同,我们可以在类中引用变量而无需使用this,但是在JavaScript中,this绑定行为非常不同,作用域也是如此。

在Java中,这是合法的:

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)
  }
}

在JavaScript中,我们没有这种行为,没有类变量(但是)。

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

对于您的示例,这意味着您始终需要使用this来引用类中存在的变量(在对象实例上技术上)。
因此,您必须使用this.myString:
repeatString() {
  console.log(this.myString);
}

您收到“引用错误(Reference Error)”,是因为引擎试图从repeatString的作用域及以上范围中查找名为myString的变量,但是没有找到。唯一拥有变量myString的作用域是构造函数内部的作用域,而该作用域无法从repeatString中访问。

JavaScript中的类与Java截然不同(这里是一个概述),尽管语法看起来非常相似。


1

要打印myString变量,请使用console.log(this.myString);


1

要访问类的变量,请使用 this. 变量名。

请检查下面的代码。

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

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

const myClass = new MyClass('Hello');
myClass.repeatString();


1
为了表明你是在引用名为myString的对象的属性而不是同名变量,你的console.log()调用应该写成:
console.log(this.myString);

0
在JavaScript中,可以使用this.member-variable语法来访问类成员变量。
解决问题的正确方法如下:

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接