2012-08-01 89 views
1

在「只是好奇」或「是否有可能?Javascript:獲取對象字符串中當前對象屬性的名稱

比方說我有...

home: function(options) { 
    this._home('home', options) 
} 

login: function(options) { 
    this._home('login', options) 
} 

homelogin顯然標識符幾十個對象的屬性進行跟蹤。有沒有辦法只是返回homelogin而不使用任何變量(外部函數調用罰款)的對象屬性?

更新:原來這是不可能的。接受的答案並不完全回答這個問題,但它是簡化對同一財產的衆多呼叫的一個很好的例子。

回答

3

如果你的意思是你想要的home屬性引用才能夠得到某種方式從屬性名稱的字符串"home"沒有硬編碼則沒有,據我所知這是不可能的函數中。

在你想達到什麼目的只是猜測,會是這樣的幫助至少一點點:

function callHome(propName) { 
    return function(options) { 
     this._home(propName, options); 
    } 
} 

var someObj = { 
    home: callHome('home'), 
    login: callHome('login') 
} 
someObj.home({some:"option"}); 

至少這樣你就不必重複相同的函數體爲每個屬性。演示:http://jsfiddle.net/EeEAw/

注:我假設_home()函數調用,但在問題沒有定義會在真實世界中的代碼定義的地方。我沒有在我的回答中顯示它,儘管我在我的小提琴中創建了一個虛擬的。

正如順便說一句,請注意該函數並不真正「屬於」對象或財產 - 還有什麼能阻止你做這樣的事情:

var obj = { 
    test : "test", 
    home : function() { 
     alert(this.test); 
    } 
}; 
var funcRef = obj.home; 
var obj2 = { 
    method1 : funcRef 
} 
obj.home = null; 
funcRef(); 
obj2.method1(); 

也就是說,你可以創建對同一個函數的多個引用,並且即使原始obj.home屬性設置爲某個其他值(只要其他引用繼續存在),該函數也將繼續存在。

+0

Ooops,你不能動態設置這樣的對象屬性。 'home:callHome('home')'拋出一個typeError(試圖調用不是函數的東西),因爲沒有'_home'屬性。 – RobG 2012-08-01 06:03:43

+0

@RobG - 我認爲OP會提供'_home'屬性,因爲它沒有在問題中顯示,但在我的jsfiddle演示中,我確實提供了一個樣本'_home'。話雖如此,實際上你在創建對象時不會出錯 - 在對象文本中使用'home:callHome('home')'沒有問題,因爲'callHome()'不使用缺少的'_home '屬性,它返回使用'_home'的另一個函數。如果你試圖說'someObj.home()',那麼你只會在稍後遇到問題,並且此時還沒有'_home'函數。 – nnnnnn 2012-08-01 06:05:55

+0

是的,當您嘗試調用它時發生錯誤。 – RobG 2012-08-01 06:14:48

1

標識符解析和對象屬性查找使用完全獨立的方法。您可以使用將一個對象添加到作用域鏈的頂部,但這是非常推薦的對象,完全可能在嚴格模式下完全失敗。

所以,如果您有:

var obj = {test:'test'}; 
alert(test); 

然後標識測試是在作用域鏈解決。由於它不存在,所以會引發錯誤。然而,用於:

alert(obj.test); 

然後首先OBJ被解析,結果發現作爲參考到一個對象,則所述標識符測試解析爲對象的屬性。您還可以使用

在這種情況下
with (obj) { 
    alert(test); 
} 

OBJ被暫時放置在範圍鏈的頂端,因此測試上它首先解決了。

相關問題