Estoy usando clases modelo que amplían una clase Model base. La clase Model devuelve un Proxy del constructor que me permite acceder a las propiedades pasadas al constructor sin tener que definirlas explícitamente en la clase.
Usando esto, puedo acceder a una propiedad del objeto de data externamente, pero intentar acceder internamente devuelve indefinido. ¿Cómo puedo acceder a las propiedades proxy desde dentro de la propia clase?
class Model { constructor(data) { this.data = data; return new Proxy(this, { get(model, prop) { if (model.hasOwnProperty(prop) || prop in model) { return model[prop]; } if (model.data.hasOwnProperty(prop)) { return model.data[prop]; } } }); } } class User extends Model { get name() { return `${this.first_name} ${this.last_name}`; } } const user = new User({ first_name: 'Bob', last_name: 'Smith' }); console.log(user.first_name); // 'Bob' console.log(user.name); // undefined undefinedDebe usar Reflect.get () para acceder a las propiedades en el objeto original
Reflejar
Reflect es un objeto incorporado que proporciona métodos para operaciones de JavaScript interceptables. Los métodos son los mismos que los de los controladores de proxy . Reflect no es un objeto de función, por lo que no es construible.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect
Reflejar.obtener()
El método estático
Reflect.get()funciona como obtener una propiedad de un objeto (target[propertyKey]) como una función.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/get
class Model { constructor(data) { this.data = data return new Proxy(this, { get(model, prop) { if (model.data.hasOwnProperty(prop)) { return model.data[prop] } return Reflect.get(...arguments) }, }) } } class User extends Model { get name() { return `${this.first_name} ${this.last_name}` } } const user = new User({ first_name: 'Bob', last_name: 'Smith', }) console.log(user.first_name) // 'Bob' console.log(user.name) // 'Bob Smith' Reflect.get toma 3 argumentos: el objeto, la clave y this contexto es opcional.
Aquí Reflect.get(...arguments) es equivalente a Reflect.get(model, prop)
Reflect.get Reflect.get({ x: 1, y: 2 }, 'x') // 1 Reflect.get(['zero', 'one'], 1) // "one"