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
函数内部会引用任何被调用函数的对象( 上下文 )。
通常点符号会为你做这this
: object.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
你可以返回一个Parser
types。
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