所有Javascript对象的通用getter/setter?
是否可以为所有Javascript对象定义通用的getter/setter 下面是我想做的伪代码。基本上,人和动物的路线获取者和设定者到客户获取者和客户设定者所有Javascript对象的通用getter/setter?,javascript,getter-setter,Javascript,Getter Setter,是否可以为所有Javascript对象定义通用的getter/setter 下面是我想做的伪代码。基本上,人和动物的路线获取者和设定者到客户获取者和客户设定者 function NewPerson() { var person; var animal; var person.name = 'John Doe'; console.log("Name: " + person.name); //Prints "Name: JOHNDOE CUSTOM" va
function NewPerson()
{
var person;
var animal;
var person.name = 'John Doe';
console.log("Name: " + person.name); //Prints "Name: JOHNDOE CUSTOM"
var animal.type = 'Herbivore';
console.log("Animal: " + animal.type); //Prints "Animal: HERBIVORE CUSTOM"
console.log("Age: " + person.age); //Prints "Age: NON EXISTANT PROPERTY";
}
function CustomGetter(theObj, propertyName)
{
if(theObj.hasproperty(propertyName))
return ToUpperCase(theObj.propertyName);
else
{
return "NON EXISTANT PROPERTY";
}
}
function CustomSetter(theObj, propertyName, value)
{
if(theObj.hasproperty(propertyName))
theObj.propertyName = value + " CUSTOM";
else
{
console.log("NON PROPERTY TO SET");
}
}
谢谢大家! 您可以使用Object.defineProperty创建属性设置器或获取器: 从MDN文档中:
Object.defineProperty(obj, 'propertyName', {
get: function() { return bValue; },
set: function(newValue) { bValue = newValue; },
enumerable: true,
configurable: true
});
我最近刚做了类似的事情。如果在原型上定义了属性,则可以将其应用于所有实例。有点像这样:
Object.defineProperty(Object.prototype, 'test', {
get: function () {
return "a test";
}
});
var test = new Array(2);
console.log(test); //a test
现在,任何对象都将具有“test”属性。您应该使用代理陷阱来执行您想要的操作 文件: 您可以使用类和原型轻松地执行该操作,但我更愿意使用getter/setter陷阱将自定义处理程序转换为闭包 通常,它可以是这样的:
var Person = function(profile={})
{
var required = ["age", "name", "profession"];
var buildProfile = function(p)
{
for(var prop of required)
{
if(!(prop in p))
throw new ReferenceError
("⛔ Missing required property to profile '" +(prop+" in "+JSON.stringify(profile))+ "'");
}
return p;
}(profile);
var anotherPrivateFunc = function()
{
// ...
};
var publicMethods =
{
status: function(prop, value)
{
// ...
},
isAdult: function()
{
return this.age >= 18;
},
};
Object.assign(profile, publicMethods);
return new Proxy(profile,
{
get: function(target, prop, receiver)
{
if(prop in target)
{
switch(prop)
{
case "name":
return target[prop].toUpperCase(); break;
}
}
return Reflect.get.apply(Object.getOwnPropertyDescriptor, arguments);
}
});
};
看看Object.defineProperty:对于对象,没有全面的setter/getter,您需要将对象包装在代理中才能获得该功能:谢谢。我看了一下,似乎代理更像是答案,而不是定义属性。使用代理,我甚至可以捕获不存在的属性。
var person = new Person({age:32, name: "Water", profession:"developper"})
person.name // will return WATER
person.age // --> 32
person.isAdult() // --> true
var person = new Person({age:32}) // will throw an cusotm error
Uncaught ReferenceError: ⛔ Missing required property to profile 'name in {"age":3}'