给定这个 JavaScript 对象,我想通过以 'get' + CamelCased 属性名称开始的动态方法访问它们的嵌套属性(当然该属性必须在初始对象中定义)
据我所知,这可以通过使用代理对象+递归来实现,但无论如何我需要你的输入。
致以诚挚的问候!
function Order() {
this.no = 'n1234';
this.info = {
customer: {
ID: 'c1234'
address: {
//...
shiping: {
// ...
}
}
}
}
}
var order = new Order();
// The expected result should be:
// order.no = order.getNo()
// order.info = order.getInfo()
// order.info.customer or order.info.getCustomer() or order.getInfo().customer or order.getInfo().getCustomer()
// and so on for all nested attributes
这是我准备的代码片段,但它似乎不适用于嵌套属性。
function createProxy(obj) {
return new Proxy(obj, {
get(target, prop) {
if (typeof target[prop] === 'object' && target[prop] !== null) {
return createProxy(target[prop]);
}
if (prop.startsWith('get')) {
const propName = prop.charAt(3).toLowerCase() + prop.slice(4);
if (target[propName] !== undefined) {
return () => target[propName];
}
}
return target[prop];
},
});
}
function Order() {
const properties = {
no: 'n1234',
info: {
customer: {
ID: 'c1234'
}
}
};
return createProxy(properties);
}
var order = new Order();
// order.getInfo().customer - { ID: 'c1234' }
// order.getInfo().getCustomer() - TypeError: order.getInfo().getCustomer is not a function"
function createProxy(obj) {
return new Proxy(obj, {
get(target, prop) {
if (target[prop]?.__proto__ === Object.prototype) {
return createProxy(target[prop]);
}
if(!prop.startsWith){
debugger;
}
if (prop.startsWith?.('get')) {
const propName = prop.charAt(3).toLowerCase() + prop.slice(4);
if (target[propName]?.__proto__ === Object.prototype) {
return (function(){
return createProxy(target[propName]);
}).bind(target);
}
}
return Reflect.get(...arguments);
},
});
}
function Order() {
const properties = {
no: 'n1234',
info: {
customer: {
ID: 'c1234'
}
}
};
return createProxy(properties);
}
var order = new Order();
console.log(order.getInfo().getCustomer());