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()

     }

}

json.keyone();

json.keytwo();


此代码在浏览器中不起作用,返回window. 我希望它返回函数的键名,如下例所示:


...


'keyname' : function(){

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

}


...

我怎样才能做到这一点?


哆啦的时光机
浏览 110回答 1
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在现代浏览器中,您的函数具有名称(它们的名称来自您分配给它们的属性)。不推荐使用的arguments.callee属性为您提供了对被调用函数的引用,您可以从中获取它name:const json = {    'keyone' : function () {         console.log(arguments.callee.name);     } ,     'keytwo' : function () {         console.log(arguments.callee.name);     }};json.keyone();json.keytwo();但同样,我强烈建议改为更改您的结构。callee已弃用,并且在严格模式下不起作用,并且较旧的浏览器(不支持 ES2015 的隐含函数名称的浏览器)不分配函数名称。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript