简单的类定义示例和回调错误

时间:2017-04-10 19:17:41

标签: javascript class callback

来自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");

1 个答案:

答案 0 :(得分:0)

当您将callback传递给此setTimeout setTimeout(callback(true, null));时,您实际上会在传递之前调用它。所以你传递了callback的结果。相反,你需要做这样的事情

setTimeout(() => callback(true, null));

setTimeout(callback.bind(context, true, null));

根据你的问题:

你不能在js中保持类道具和方法的私密性。有一种惯例是让其他人知道最好不要使用它们,因为它们意味着内部实施 - this._propthis._method。如果你真的想让这些变量不可访问,你应该让它们成为模块的变量,这样它们就可以用模块作为范围了。

var name = '';

class Person {}

但是对于一个类来说显然不是这种情况,因为这个变量不是动态的,而是与该类的实例保持一致。