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

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

最佳答案

三种解决方案:

  • 将您的对象实现为 Proxy ,旨在完全满足您的需求。 然而,这只是一个草稿,目前只有supported in Firefox' Javascript 1.8.5 它已通过 ES6 标准化,但可能尚未在所有环境中可用。

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

    但是一个不存在的属性应该总是意味着“没有这样的消息”而不是“没有可用的翻译”。

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

    我会推荐一个不同于字典的 map 对象,以允许“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; }
    };
})();

关于javascript - 读取前设置未定义的 javascript 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11503666/

相关文章:

javascript - 灵活的导航栏在较小的屏幕上损坏

javascript - 我需要 Ajax .on 来触发第二个 .on 而不是第一个

javascript - 在 AngularJS 中获取 JSESSIONID 值并创建 Cookie

javascript - 如何在 JavaScript 中将对象返回到不同的作用域?

JavaScript getter 在继承期间运行

javascript - 数组数组的 "column total"的模式

C++比较两个对象

javascript - 通过 Javascript 获取数组或对象的名称

java - (需要标识符)getter/setter 和对象

java - getter 和 setter 并增加一个变量