来自C#和Java背景,在Javascript中尝试使用公共/私有方法,公共/私有成员等进行类定义很困难。
我在这里有一个简单的例子,显示了Person.js和PersonTest.js。在start()
方法中有一个回调,因为在我的实际应用程序中,那里会有RESTful HTTP调用,它将使用回调(失败时出现以下错误:TypeError: "callback" argument must be a function
。< / p>
我有几个问题,希望有人可以提供帮助:
1)为什么回调&#39;参数必须是函数错误?我已在方法中完成console.log(callback)
,并显示[Function]
。
2)如何保持this.name,this.age,this.debug无法访问?
3)如何让start(callback)
无法访问?
Person.js
'use strict';
class Person {
// Methods
log(msg) {
if (this.debug) console.log(msg);
}
start(callback) {
var self = this;
this.log("starting");
console.log(callback);
setTimeout(callback(true, null));
}
speak(msg) {
this.log(msg);
}
// Constructor
constructor(name, age, debug) {
this.name = name;
this.age = age;
this.debug = debug;
var self = this;
this.start(function(data, err) {
console.log("data: " + data);
console.log("err: " + err);
if (data) {
self.log("started successfully");
}
else {
self.log("unable to start");
}
});
}
};
module.exports = Person;
PersonTest.js
const Person = require('./Person.js');
let p = new Person("henry", 50, true);
p.speak("foo");
答案 0 :(得分:0)
当您将callback
传递给此setTimeout
setTimeout(callback(true, null));
时,您实际上会在传递之前调用它。所以你传递了callback
的结果。相反,你需要做这样的事情
setTimeout(() => callback(true, null));
或
setTimeout(callback.bind(context, true, null));
根据你的问题:
你不能在js中保持类道具和方法的私密性。有一种惯例是让其他人知道最好不要使用它们,因为它们意味着内部实施 - this._prop
或this._method
。如果你真的想让这些变量不可访问,你应该让它们成为模块的变量,这样它们就可以用模块作为范围了。
var name = '';
class Person {}
但是对于一个类来说显然不是这种情况,因为这个变量不是动态的,而是与该类的实例保持一致。