Путь вызова 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 шт):

Автор решения: Grundy

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)

→ Ссылка