rnd*_*ndm 6 javascript getter object
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
Run Code Online (Sandbox Code Playgroud)
有没有办法让tr.Other或tr ['Other']和对象的所有其他未定义属性返回其名称而不是未定义?
三种解决方案
将您的对象实现为一个Proxy,旨在完全按照您的意愿执行.然而,它只是一个草案,目前仅在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; }
};
})();
Run Code Online (Sandbox Code Playgroud)
您可以使用对象初始值设定项为您的属性定义一个 getter :
var o = {
a: 7,
get b() {
return this.a + 1;
},
set c(x) {
this.a = x / 2;
}
};
console.log(o.a); // 7
console.log(o.b); // 8 <-- At this point the get b() method is initiated.
o.c = 50; // <-- At this point the set c(x) method is initiated
console.log(o.a); // 25
Run Code Online (Sandbox Code Playgroud)
或使用Object.defineProperties():
var o = { a: 0 };
Object.defineProperties(o, {
'b': { get: function() { return this.a + 1; } },
'c': { set: function(x) { this.a = x / 2; } }
});
o.c = 10; // Runs the setter, which assigns 10 / 2 (5) to the 'a' property
console.log(o.b); // Runs the getter, which yields a + 1 or 6
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
999 次 |
| 最近记录: |