如何获取运行函数所属的对象名?

时间:2014-01-17 19:26:13

标签: javascript node.js

我正在尝试在节点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函数的对象的名称?

3 个答案:

答案 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”对象。