【问题标题】:Difference between classes in Java vs JavaScript?Java与JavaScript中的类之间的区别?
【发布时间】:2017-12-08 14:57:10
【问题描述】:

我有一些 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。我做错了什么/正确的方法是什么?

【问题讨论】:

    标签: javascript java node.js


    【解决方案1】:

    与 Java 等某些语言不同,我们可以在类中引用变量,而无需在 JavaScript 中使用 thisthis 绑定 behaves much differently,范围界定也是如此。

    在 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),尽管语法看起来非常相似。

    【讨论】:

      【解决方案2】:

      可以使用 this.member-variable 语法访问 JavaScript 中的类成员变量。

      解决问题的正确方法如下:

      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;
      

      【讨论】:

        【解决方案3】:

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

        请检查下面的代码。

        class MyClass {
            constructor(myString) {
                this.myString = myString;
            }
        
            repeatString() {
                console.log(this.myString);
            }
        }
        
        const myClass = new MyClass('Hello');
        myClass.repeatString();

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            要表明您指的是名为 myString 的对象的属性,而不是同名的变量,您的 console.log() 调用应为:

            console.log(this.myString);
            

            【讨论】:

              猜你喜欢
              • 2010-10-22
              • 1970-01-01
              • 2016-02-08
              • 2015-05-25
              • 1970-01-01
              • 1970-01-01
              • 2012-05-07
              • 2021-09-09
              • 1970-01-01
              相关资源
              最近更新 更多