我正在尝试在节点js中编写db抽象,这是情况:
想象一下,我有一个表对象数组,其中包含数据库中每个表的对象:
tables = [{ tableName: product, select: mySelect }, { tableName: order, select: mySelect }]
正如您所看到的,每个表都有一个选择。现在问题是在mySelect函数中我想根据调用者的表名生成一个sql脚本,如下所示:
function mySelect(){
var tableName = //Find the callers name (for instance product);
var select = "SELECT * FROM " + tableName
}
如何获取在JavaScript中调用select函数的对象的名称?
答案 0 :(得分:3)
function myfunc() { alert(arguments.callee.name); }
b = myfunc;
b();
这会写“myfunc”(FF,Chrome,我认为Safari)
如果你想从外面获取名字,你可以解析它:
b.toString();
但我认为函数对象的name属性可能是你需要的:
alert(b.name);
我已经读过, IE和Opera 中没有这个功能,所以你可以在这些浏览器中手动解析它。
Antoher替代
function antoherFunction(args) {
var ret = args.toString();
ret = ret.substr('function '.length);
ret = ret.substr(0, ret.indexOf('('));
return ret;
}
但是......使用 Function.caller 是非标准的, arguments.callee 在严格模式中是被禁止的。
答案 1 :(得分:0)
您始终可以将表名作为参数发送给函数。
例如
for(var i = 0, len = tables.length; i < len; i++)
{
tables[i].select(tables[i].tableName);
}
或者如果您的对象类似于ORM(对象关系模型),其中每个表都有自己的类,那么您可以使用this.constructor或this.tableName作为对象已经包含表名。
例如
function mySelect(){
var tableName = this.constructor;
// or tableName = this.tableName;
var select = "SELECT * FROM " + tableName
}
答案 2 :(得分:0)
谢谢你,每一篇文章都帮助了我。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
在我创建db.tables时使用bind函数我将select函数绑定到当前表对象:
for(var i=0; i< tables.length; i++){
db.tables[tables[i].tablename] = {};
db.tables[tables[i].tablename].select = select.bind(tables[i]);
}
这样我可以确保当我调用产品对象的select函数时,“this”关键字总是引用“product”对象。