我们可以在 javascript 中的对象上指定通用 getter 吗?
Can we specify a generic getter on an object in javascript?
我想做:
properties.email.value
而不会触发如下错误:Can't read 'value' of 'undefined'
但是,我不想做:
properties.email && properties.email.value
并且我不想使用助手,例如:get(properties, 'email.value')
.
我真的很想保留语法 properties.email.value
我可以通过以下方式解决这个问题:
Object.defineProperty(properties, 'email', {
get: () => properties.email && properties.email.value,
enumerable: true,
configurable: true
});
现在 getter
负责我的安全检查。完美。
但我也希望能够安全地properties.name.value
。
但是由于 properties
对象来自 API (json),我不知道 properties
可能的完整列表。
那么,有没有一种方法可以将这种 "magical" get
语法用于任何 prop 访问,例如:properties[ANYTHING].value
?
好的,我有这样的东西。
但您必须以这种方式创建 properties
。
希望对您有所帮助:)
var properties = {
phone : {
value: "123456789"
}
}
var handler = {
get: function(target, name) {
return target.hasOwnProperty(name) ? target[name] : {};
}
};
var new_properties = new Proxy(properties, handler);
console.log("phone.value = " + new_properties.phone.value);
console.log("email.value = " + new_properties.email.value);
new_properties.email = {
value: 1
};
console.log("email.value after assign = " + new_properties.email.value);
文档参考 here.
已编辑
即使原始 properties
对象未知,这种用法也适用。
您可以使用 Proxy
并获得已知属性和未知属性的自定义结果。
对于更改属性,您可以采用相同的方法并设置值。
var properties = { email: { value: 'foo@example.com' } },
proxy = new Proxy(
properties,
{
get: function(target, prop, receiver) {
if (prop in target) {
return target[prop] && target[prop].value
} else {
return;
}
},
set: function(target, prop, value) {
if (prop in target) {
target[prop].value = value;
} else {
target[prop] = { value };
}
}
}
);
console.log(proxy.email);
console.log(proxy.bar);
proxy.email = '41';
console.log(proxy.email);
我简直不敢相信我正在这样做...
var wordlength = 7;
var alphabet="abcdefghijklmnopqrstuvwxyz";
alphabet += alphabet.toUpperCase() + "0123456789_";
var alen = alphabet.length;
var buildWord = function(number){
if(number===0){
return '';
}
return alphabet[number%alen]+buildWord(Math.floor(number/alen));
};
var total = Math.pow(alen, wordlength);
for(var i = 1; i<total; i++){
var w = buildWord(i);
if(isNaN(w[0]) && Object.prototype[w]===undefined){
Object.prototype[w]={};
}
}
我想做:
properties.email.value
而不会触发如下错误:Can't read 'value' of 'undefined'
但是,我不想做:
properties.email && properties.email.value
并且我不想使用助手,例如:get(properties, 'email.value')
.
我真的很想保留语法 properties.email.value
我可以通过以下方式解决这个问题:
Object.defineProperty(properties, 'email', {
get: () => properties.email && properties.email.value,
enumerable: true,
configurable: true
});
现在 getter
负责我的安全检查。完美。
但我也希望能够安全地properties.name.value
。
但是由于 properties
对象来自 API (json),我不知道 properties
可能的完整列表。
那么,有没有一种方法可以将这种 "magical" get
语法用于任何 prop 访问,例如:properties[ANYTHING].value
?
好的,我有这样的东西。
但您必须以这种方式创建 properties
。
希望对您有所帮助:)
var properties = {
phone : {
value: "123456789"
}
}
var handler = {
get: function(target, name) {
return target.hasOwnProperty(name) ? target[name] : {};
}
};
var new_properties = new Proxy(properties, handler);
console.log("phone.value = " + new_properties.phone.value);
console.log("email.value = " + new_properties.email.value);
new_properties.email = {
value: 1
};
console.log("email.value after assign = " + new_properties.email.value);
文档参考 here.
已编辑
即使原始 properties
对象未知,这种用法也适用。
您可以使用 Proxy
并获得已知属性和未知属性的自定义结果。
对于更改属性,您可以采用相同的方法并设置值。
var properties = { email: { value: 'foo@example.com' } },
proxy = new Proxy(
properties,
{
get: function(target, prop, receiver) {
if (prop in target) {
return target[prop] && target[prop].value
} else {
return;
}
},
set: function(target, prop, value) {
if (prop in target) {
target[prop].value = value;
} else {
target[prop] = { value };
}
}
}
);
console.log(proxy.email);
console.log(proxy.bar);
proxy.email = '41';
console.log(proxy.email);
我简直不敢相信我正在这样做...
var wordlength = 7;
var alphabet="abcdefghijklmnopqrstuvwxyz";
alphabet += alphabet.toUpperCase() + "0123456789_";
var alen = alphabet.length;
var buildWord = function(number){
if(number===0){
return '';
}
return alphabet[number%alen]+buildWord(Math.floor(number/alen));
};
var total = Math.pow(alen, wordlength);
for(var i = 1; i<total; i++){
var w = buildWord(i);
if(isNaN(w[0]) && Object.prototype[w]===undefined){
Object.prototype[w]={};
}
}