开发者社区> 问答> 正文

Javascript对象如何从函数内部获取密钥

我已经尝试过使用此代码进行覆盖,'keyone'并且可以正常工作。

const json = { 'keyone' : function () { console.log(Object.keys(this)[0]) // it prints keyone when call json.keyone() } , 'keytwo' : function () { console.log(Object.keys(this)[1]) // it prints keytwo when call json.keytwo() } } 此代码在浏览器上不起作用,此返回值window 我想在以下示例的函数中返回键名

...

'keyname' : function(){ console.log('code for printing this function's keyname') }

... 我怎样才能做到这一点?

展开
收起
方不方便 2020-03-22 22:27:58 563 0
1 条回答
写回答
取消 提交回答
  • 您所调用的函数没有合理的方法来知道引用它的属性的名称是什么。如果你想的话,你需要改变你的结构。一种方法是绑定函数名作为它的第一个参数:

    const json = { 'keyone' : function (name) { console.log(name); } , 'keytwo' : function (name) { console.log(name); } }; for (const [key, func] of Object.entries(json)) { json[key] = func.bind(null, key); }

    json.keyone(); // "keyone: json.keytwo(); // "keytwo"

    不改变结构的不合理方法是在现代浏览器上使用arguments.callee.name,因为它在严格模式下无法工作,我也不建议这样做。在现代浏览器中,函数有名称(它们的名称来自分配给它们的属性)。弃用的参数。callee属性给你一个被调用函数的引用,你可以从中得到它的名字: const json = { 'keyone' : function () { console.log(arguments.callee.name); } , 'keytwo' : function () { console.log(arguments.callee.name); } };

    json.keyone(); json.keytwo();

    但是,我再次强烈建议改变你的结构。callee是不支持的,并且不能在严格模式下工作,而且旧的浏览器(不支持ES2015隐含的函数名)不分配函数名。

    回答来源:stackoverflow

    2020-03-22 22:30:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
JavaScript函数 立即下载
Delivering Javascript to World 立即下载
编程语言如何演化-以JS的private为例 立即下载