Java与JavaScript的类之间的区别?

时间:2017-07-05 05:40:49

标签: javascript java node.js

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

所以我有if (vtype[i] == "OtherView") && (cattypelink == "Image") { print("i is \(i)") imagestrng = demoarray[i] self.imgtag = i self.tag = self.imgtag print("imagestring is sswqqwqew \(imagestrng)") let actualURL = URL(string: imagestrng) self.downloadImage(with: actualURL!) } func downloadImage(with url:URL) { print("inside download image") SDWebImageManager.shared().downloadImage(with: url, options: SDWebImageOptions(rawValue: 0), progress: nil) { (image, _, _, _, _) in if let _ = image { print("image downloaded") if self.tag == self.imgtag { var finalimage: UIImage = image! print("finalimage is \(finalimage)") self.othersimg = UIImageView(frame: self.oview.frame) self.othersimg?.image = nil self.othersimg?.image = finalimage self.oview = UIView(frame: CGRect(x:0,y:0,width:self.sigeImg.width,height:self.sigeImg.height)) self.mainview.addSubview(self.oview) self.oview.addSubview(self.othersimg!) self.othersimg?.tag = self.imgtag print("othersimg is \(self.othersimg?.tag)") } else { print("nothing") } } else { print("not downloaded '") // Try to download again (optional) self.downloadImage(with: url) } } } 文件,它有以下代码:

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。我做错了什么/做这件事的正确方法是什么?

5 个答案:

答案 0 :(得分:4)

与Java这样的语言不同,我们可以在不使用this的情况下引用类中的变量,在JavaScript中使用this绑定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)。

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

对于您的示例,这意味着在引用类中存在的变量(技术上在对象实例上)时,始终需要使用this

因此,您必须使用this.myString

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

您正在获取Reference Error,因为引擎会尝试从myString的范围开始向上查找名为repeatString的变量,并且没有任何内容。具有变量myString的唯一范围是构造函数中的范围,并且该范围无法从repeatString访问。

JavaScript中的类与Java完全不同(here's an overview),即使语法看起来非常相似。

答案 1 :(得分:1)

要表明您引用了名为myString的对象的属性而不是具有相同名称的变量,您的console.log()调用应显示为:

console.log(this.myString);

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

请检查以下代码。

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

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

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

答案 4 :(得分:0)

可以使用 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;