2012-07-16 31 views
5
var tr={}; 
tr.SomeThing='SomeThingElse'; 
console.log(tr.SomeThing); // SomeThingElse 
console.log(tr.Other); // undefined 

tr.get=function(what){ 
    if (tr.hasOwnProperty(what)) return tr[what]; 
    else return what; 
}; 
tr.get('SomeThing') // SomeThingElse 
tr.get('Other') // Other 

是否有任何方法使tr.Other或tr ['Other']和對象的所有其他未定義屬性返回其名稱而不是undefined?在讀取之前設置undefined javascript屬性

+0

號爲什麼你想這樣做? get()函數有什麼問題? – Bergi 2012-07-16 17:14:21

+0

'tr'是包含網站翻譯的對象。有時候他沒有必填字段 – rndm 2012-07-17 06:03:55

+0

好的,儘管我認爲英語(或其他)的回退會比留言的名稱更好:-)請回答我的第二個問題:get()函數有什麼問題? – Bergi 2012-07-17 09:36:19

回答

2

你可以define a getter爲您的財產。

+0

它被棄用和非標準,並且不能解決我的問題 – rndm 2012-07-16 13:08:57

+1

只有'Object.prototype .__ defineGetter __()'被棄用。 'Object.defineProperty()'和'{get propName(){}}'是標準的,不推薦使用。正如你所說,你的問題可以通過獲得者來解決。如果未定義,你已經要求一個特定的屬性('Other')返回它的名字,你是否要求對象的_any_屬性返回它的名字?如果是這樣,請更新您的問題。 – lanzz 2012-07-16 13:48:19

+0

是的,我需要或對象的任何屬性返回其名稱 – rndm 2012-07-16 16:57:46

4

三種解決方案:

  • 實現你的對象作爲Proxy,其目的是做的正是你想要的。 然而,這只是一個草案,目前只有supported in Firefox' Javascript 1.8.5它是用ES6標準化的,但可能還不適用於所有環境。

  • 總是用一整套信息填滿你的翻譯對象。在創建「字典」(服務器端或客戶端)時,始終包含所有必需的密鑰。如果不存在翻譯,則可以使用後備語言,消息名稱或undefined的字符串表示形式 - 您的選擇。

    但是一個不存在的屬性應該總是指「沒有這樣的信息」,而不是「沒有可用的翻譯」。

  • 使用帶字符串參數而不是對象屬性的getter函數。該函數可以查看內部字典對象中的消息,並以編程方式處理缺失。

    我會建議一個地圖對象,它是從字典不同,允許「獲取」並共同爲消息名稱:

var translate = (function(){ 
    var dict = { 
     something: "somethingelse", 
     ... 
    }; 
    return { 
     exists: function(name) { return name in dict; }, 
     get: function(name) { return this.exists(name) ? dict[name] : "undefined"; }, 
     set: function(name, msg) { dict[name] = msg; } 
    }; 
})(); 
1

雖然這種解決方案是不準確你在找什麼,python的collections.defaultdict類的JavaScript實現可能有所幫助:

var collections = require('pycollections'); 
var dd = new collections.DefaultDict([].constructor); 
console.log(dd.get('missing')); // [] 
dd.get(123).push('yay!'); 
console.log(dd.items()); // [['missing', []], [123, ['yay!']]]