Nodejs模块instanceof

时间:2013-11-06 13:55:03

标签: javascript node.js module

我有简单的模块 query.js

module.exports = function(queryString){
     return{
         string: queryString
     };
};

现在我从另一个模块加载这个模块并从中创建实例:

var Query = require("./query");
var myQuery = new Query("SELECT * FROM `mytabel`");

console.log(myQuery instanceof Query); // Ouputs false
console.log(myQuery.constructor == Query); // Outputs false

正如我从nodejs文档中所理解的那样,require(“Query”)给了我module.exports对象,在我的例子中是一个接受1个参数queryString的匿名函数。我使用此函数来创建新对象myQuery,但它不是Query的实例。

我的问题:我如何检查myQuery是否是从Query函数创建的,为什么两个输出都是假的,我认为它们应该是真的?

2 个答案:

答案 0 :(得分:5)

虽然dskh是正确的,但更多的解释可能是有价值的。

当函数返回

时,作为构造函数。

一旦函数返回一个Object(例如function SomeFunc() { return {}; }),如果你调用var a = new SomeFunc();,变量a将成为返回的Object,它是一个普通的Object,并且不会是创建的SomeFunc的实例。如果SomeFunc返回的东西不是Object,那么JS引擎会忽略函数返回的任何内容,而是返回一个实例SomeFunc的Object,这就是你想要的。

因此,在您的情况下,您返回一个Object,但为了使其作为构造函数工作,您需要不返回任何内容(或者至少不返回Object):

module.exports = function(queryString){
     this.string = queryString;
};

请参阅,它不会返回一个Object,因此每次调用new Query()时都会得到一个Query实例。

答案 1 :(得分:3)

现在您正在导出一个对象。你需要导出一个类。

function Query(querystring){
    this.querystring = querystring;
}

module.exports = Query;