我正在使用擴展基類的模型Model類。該類從建構式Model回傳 a Proxy,它允許我訪問傳遞給建構式的屬性,而無需在類上顯式定義它們。
使用它,我可以從data外部訪問物件的屬性,但嘗試在內部訪問它會回傳未定義。如何從類本身訪問代理屬性?
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 undefined
uj5u.com熱心網友回復:
您需要使用 Reflect.get() 來訪問原始物件的屬性
反映
Reflect 是一個內置物件,它為可攔截的 JavaScript 操作提供方法。這些方法與代理處理程式的方法相同。Reflect 不是一個函式物件,所以它是不可構造的。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect
反射.get()
靜態
Reflect.get()方法的作業方式類似于從物件 (target[propertyKey]) 中獲取屬性作為函式。
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接受 3 個引數:物件、鍵和可選this背景關系。
這里Reflect.get(...arguments)相當于Reflect.get(model, prop)
如何使用Reflect.get
Reflect.get({ x: 1, y: 2 }, 'x') // 1
Reflect.get(['zero', 'one'], 1) // "one"
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/470981.html
標籤:javascript 班级 代理
上一篇:ReactJS條件調度減速器動作
