javascript - Java 类和 JavaScript 类之间的区别?

标签 javascript java node.js

我有一些使用 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;

当我尝试运行它时,当它尝试执行 repeatString() 方法时,我得到了 ReferenceError: myString is not defined。我做错了什么/这样做的正确方法是什么?

最佳答案

不像 Java 这样的语言,我们可以在不使用 this 的情况下引用类中的变量,this 绑定(bind) behaves much differently在 JavaScript 中,作用域也是如此。

在 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 中,我们没有这种行为,没有类变量 ( yet ) 这样的东西。

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 中的类完全不同 ( here's an overview ),尽管语法看起来非常相似。

关于javascript - Java 类和 JavaScript 类之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44917769/

相关文章:

java - 具有实现特定参数类型的模板方法模式

javascript - 在 setTimeout() 中将参数传递给匿名函数

javascript - 忽略 docker 卷中的每个 `node_modules`

javascript - Bootstrap 崩溃不适用于 Meteor.js 的每个循环

javascript - 具有最小/最大的随机数组

java - 如何在 MySQL Workbench 中存储 10x10 map /游戏字段?

java - 根据配置文件中的值注入(inject)依赖项

javascript - 发送并处理 POST 请求

javascript - 如何将 div 克隆放在原始 div 的正下方?

javascript - jQuery-ui 菜单子(monad)菜单不会在鼠标移出时折叠