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