在读取之前设置未定义的javascript属性

时间:2012-07-16 11:50:24

标签: javascript object getter

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']和对象的所有其他未定义属性返回其名称而不是未定义?

3 个答案:

答案 0 :(得分:5)

三种解决方案:

  • 将您的对象实现为Proxy,旨在完全按照您的意愿执行。 然而,它只是一个草稿,目前只有supported in Firefox' Javascript 1.8.5 它已使用ES6标准化,但可能尚未在所有环境中使用。

  • 始终使用一组完整的消息填充您的翻译对象。创建“字典”(服务器端或客户端)时,始终包含所有需要的密钥。如果不存在翻译,您可以使用后备语言,消息名称或undefined的字符串表示形式 - 您的选择。

    但是,不存在的财产应该始终意味着“没有这样的信息”,而不是“没有可用的翻译”。

  • 使用带有字符串参数的getter函数而不是对象属性。该函数可以在内部字典对象中查找消息,并以编程方式处理未命中。

    我建议使用与字典不同的地图对象,以允许“get”和co作为消息名称:

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 :(得分:2)

你可以为你的财产define a getter

答案 2 :(得分: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!']]]