通过自定义动态方法访问嵌套的 JavaScript 属性

问题描述 投票:0回答:1

给定这个 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"
javascript methods dynamic properties nested
1个回答
0
投票

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());

© www.soinside.com 2019 - 2024. All rights reserved.