2017-05-04 76 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