Nodejs模块instanceof

Tau*_*i28 3 javascript module node.js

我有简单的模块query.js:

module.exports = function(queryString){
     return{
         string: queryString
     };
};
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

Wil*_*der 5

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

函数只能在返回Object之外的其他内容时充当构造函数.

一旦函数返回一个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;
};
Run Code Online (Sandbox Code Playgroud)

看,它不会返回一个Object,所以每次调用时都会得到一个Query实例new Query().