2017-05-04 50 views
2

说我有类似下面的对象:从内部函数获取对象键名称?

var obj = {}; 
obj.test = function() { console.log(?); } 

反正有打印出“测试”,关键是这个函数的值,但事先不知道obj的名字?

+0

你为什么要这么做?函数只是一个值。它不知道它可能或不可能成为什么对象。它可能是对象上多个属性的值。 – 2017-05-05 05:10:52

回答

-1

试试这个Object.keys(this)arguments.callee

var obj = {}; 
 
obj.test = function() { 
 
    var o = arguments.callee; 
 
Object.values(this).map((a,b)=>{ 
 
    if(a==o){ 
 
    console.log(Object.keys(this)[b]) 
 
    } 
 
    }) 
 
} 
 
obj.one = "hi" 
 

 
obj.test()

+0

这打印出**所有**键,而不仅仅是指向功能的那个 – Quentin

+0

这不会给我具体的功能是价值的关键,它只是给我所有的关键:O – Noobit

+0

@Quentin我更新了我的回答 – prasanth

0

不是真的。 JS中的关系是单向的。

你可以搜索匹配...

var obj = {}; 
 
obj.not = 1; 
 
obj.test = function() { 
 
    var me = arguments.callee; 
 
    Object.keys(obj).forEach(function(prop) { 
 
    if (obj[prop] === me) { 
 
     console.log(prop); 
 
    } 
 
    }); 
 
}; 
 

 
obj.test();

但是看看这个:

var obj = {}; 
 
obj.not = 1; 
 
obj.test = function() { 
 
    var me = arguments.callee; 
 
    Object.keys(obj).forEach(function(prop) { 
 
    if (obj[prop] === me) { 
 
     console.log(prop); 
 
    } 
 
    }); 
 
}; 
 
obj.test2 = obj.test; 
 
obj.test3 = obj.test; 
 
window.foo = obj.test; 
 

 
obj.test();

同样的功能现在EXIS在同一个对象的三个不同属性上......并作为一个全局的对象。

0

可能是有点复杂的解决方案,但是这可能是有用的 -

您可以将在一个特定的键添加功能,你的对象的方法。使用bind方法,我们可以预先定义该函数的第一个参数是用来添加它的键。 我添加到键的功能是_template,它的第一个参数将始终是它被添加到的关键。

var obj = {}; 
 
    
 
function addKey(key) { 
 
    obj[key] = _template.bind(null, key) 
 
} 
 
    
 
function _template(key, _params) { 
 
    console.log('Key is', key); 
 
    console.log('Params are',_params); 
 
} 
 

 

 
addKey('foo') 
 
obj.foo({ some: 'data' }) // this will print "foo { some: 'data' }"


参考 - Function.prototype.bind()

-1

你可以调用的方法的名称与 arguments.callee.name

var a ={ runner_function : function(){ console.log(arguments.callee.name); } }; 
 

 
a.runner_function() //It will return "runner_function"

+0

您可能想要添加一个免责声明,即'arguments.callee'已弃用 - http:// stackoverflow。com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript/235760#235760 – Lix

+0

这似乎不适用于在我的示例中初始化对象后添加的键。它返回为“”(空白) – Noobit