Путь вызова Proxy по одной ссылке
необходимо, чтобы test ссылался на myObj и при этом выводить путь вызова, для myObj.toy - toy, для myObj.test.toy - test.toy. Как-то можно ли это реализовать? Данный код выводит всегда "this toy", на запрос, оно и понятно так как они ссылаются на один и тот же объект, но мне при этом нужно выводить путь вызова, чтобы было видно, когда вызов через объект myObj.toy, а когда через его ссылку myObj.test.toy
handler = {
get(target, prop, receiver) {
console.log(`New Handler: Getting ${prop}`);
if (prop == "test") {
return myObj
}
return target[prop];
}
};
// Пересоздаем новый прокси с новым обработчиком
const myObj = new Proxy({toy: "this toy"}, handler);
console.log(myObj.toy)
console.log(myObj.test.toy)
console.log(myObj == myObj.test) // true
Ответы (1 шт):
Proxy
не получает полную цепочку вызовов, поэтому нельзя отличить myObj.toy
от myObj.test.toy
.
Все что знает Proxy
- это свойство, обращение к которому идет в данный момент.
Максимум что можно сделать, это добавить еще один Proxy
, в котором будет храниться путь. Это может помочь в некоторых случаях, но не поможет для варианта:
console.log(myObj.toy)
var o = myObj.test;
console.log(myObj.test.toy) // 'test.toy'
console.log(o.toy) // 'test.toy'
А также сломается сравнение, так как это будут уже два разных объекта.
Пример:
function createProxy(target, path) {
return new Proxy(target, {
get(target, prop) {
const propPath = path ? path + '.' + prop : prop;
console.log(`New Handler: Getting ${path? path+'.'+prop: prop}`);
if (prop == "test") {
return createProxy(target, propPath);
}
return target[prop];
}
});
}
// Пересоздаем новый прокси с новым обработчиком
const myObj = createProxy({
toy: "this toy"
});
console.log(myObj.toy)
console.log(myObj.test.toy)
console.log(myObj.test.test.test.toy)
console.log(myObj == myObj.test)