Javascript Nodejs模块instanceof

Javascript Nodejs模块instanceof,javascript,node.js,module,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 instanc

我有一个简单的模块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是否是通过查询函数创建的,以及为什么在我看来这两个输出都应该为真时,它们都为假?现在您正在导出一个对象。您需要导出一个类

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

module.exports = Query;

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

函数只能在返回对象以外的内容时充当构造函数

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

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


请看,它不返回对象,因此每次调用
newquery()

console.log(require(“Query”))时都会得到一个查询实例;给你什么?您不需要使用require(“查询”);(小写)?@WillemMulder是的,对不起,我从头开始写了这个缩小的例子,实际上是用小写字母写的。修复了它。你是说我正在导出一个类,但该类返回一个分配给myQuery的对象,它不再是Query的实例?愚蠢的我,我怎么会错过:)。节点的模块系统不会输入东西。当您需要某些内容时,它只返回该文件中的module.exports变量。在代码中,module.exports返回一个未命名函数,该函数是函数的实例。在我的回答中,我返回一个带大写字母的命名函数(这与javascript中的类非常接近)。然后可以在instanceof语句中使用它。另外,您的require('query')语句现在可能无法工作,因为它将在package.json中查找名为query的模块。它应该是一个文件路径,例如require(“./query”)是的,这就是我的意思,是的,关于最后一部分,你是正确的-上面的代码只是为了说明一点,而不是实际的100%工作脚本。
module.exports = function(queryString){
     this.string = queryString;
};