Nodejs类与variables

我有这个parsing器类在一个文件中:

module.exports = function Parser() { this.myVar = ""; var parse = function (inputString) { this.myVar = "somethingAfterParse"; } return { initWithString: function(inputString) { parse(inputString) }, name: this.myVar }; }; 

然后,在“main”文件js中,我使用这样的parsing器:

 var Parser = require("./Parser.js"); var parserInstance = new Parser(); parserInstance.initWithString("somestring"); console.log("Parser var:", parserInstance.myVar); 

没有错误,但日志打印一个空的名字..为什么?

这是我会做的:

 function Parser() { this.myVar = ""; } Parser.prototype.initWithString = function (inputString) { this.myVar = "somethingAfterParse"; }; module.exports = Parser; 

你的方法,注释

 module.exports = function Parser() { // public property "myVar" of any new Parser object this.myVar = ""; // anonymous function assigned to private variable "parse" var parse = function (inputString) { // "this" will likely be the global object here, dangling error this.myVar = "somethingAfterParse"; } // return API object - unnecessary and makes debugging harder (*) return { // anonymous function that calls private "parse" function initWithString: function(inputString) { // calling parse without defining "this", definitely an error (**) parse(inputString) }, // the above is equivalent to and therefore better written as // initWithString: parse, // copy of (!) public property myVar, definitely an error (***) name: this.myVar }; }; 

当你省去冗余位(并利用原型链)时,你最终会得到我上面提出的build议。


*我知道这是一个定义对象的公共接口的stream行方法。 我个人不喜欢它。 从JS构造函数返回一个对象有效地打破了new运算符的用处:

  • 在构造函数中,你可以让对象的用户无法访问分配给this所有内容,比如this.myVar
  • 你得到一袋没有types信息的房产。 从技术上讲,这是可行的,但在debugging过程中并不好。 比较:

     function A() { this.a = "A"; return { a: "a" }; } function B() { this.b = "B"; } new A(); // Object {a: "a"} new B(); // B {b: "B"} 

** this函数内部会引用任何被调用函数的对象( 上下文 )。

通常点符号会为你做这thisobject.method() this设置为object内的method

但是,您不要在任何对象上调用parse()函数。 在没有上下文的情况下调用的任何函数都会在全局对象的上下文中运行(在Window浏览器中)。

你将需要通过使用var self = this;来指定上下文var self = this; 早些时候和initWithString体内的parse.apply(self, arguments)

最后,“让我们返回一个对象作为API”的方法使事情变得比他们需要的更困难。

***原始types始终由JavaScript中的值分配。 就像数字或布尔值一样,您不能引用string。 将它们分配给其他variables会复制它们。

你必须使用.apply.apply

 module.exports = function Parser() { this.name = ""; var parse = function(inputString) { this.name = "somethingAfterParse"; } return { initWithString: function(inputString) { parse.call(this, inputString) }, name: this.name }; }; 

而不是返回一个匿名 object你可以返回一个Parsertypes。

 module.exports = function Parser() { var self = this; self.name = ""; self.parse = function (inputString) { self.name = inputString + " parsed"; } return self; }; 

然后,在“main”文件js中,我使用这样的parsing器:

 var Parser = require("./Parser.js"); var parserInstance = new Parser(); parserInstance.parse("something"); console.log("Parser name:", parserInstance.name); // Parser name: something parsed