4

我有简单的模块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 函数创建的,为什么在我认为它们应该为真时两个输出都是假的?

4

2 回答 2

5

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

一个函数只有在返回一个对象以外的东西时才能充当构造函数。

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

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

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

看,它不返回一个对象,所以你每次调用都会得到一个 Query 的实例new Query()

于 2013-11-06T14:12:34.310 回答
3

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

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

module.exports = Query;
于 2013-11-06T14:02:03.067 回答