@poproboval

Как создать объект с контекстом родительского объекта?

Есть код:

let arr=[{
        key1:1,
        key2:2,
        key3:3,
        children:{
            render(){
                console.log(this.key1,"Key");//undefined
            }
        }
    }]

Можно ли создать объект children c контекстом родительского объекта, при этом не выносить родительский объект с переменной arr?
  • Вопрос задан
  • 113 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
function bindRootContext(obj, context = obj) {
  return new Proxy(obj, {
    get(target, key) {
      const val = target[key];
      return (
        val instanceof Function ? val.bind(Object.hasOwn(target, key) ? context : target) :
        val instanceof Object   ? bindRootContext(val, context) :
                                  val
      );
    },
  });
}


const obj = bindRootContext({
  name: 'Root',
  a: {
    name: 'A',
    logName() { console.log(this.name); },
    b: {
      name: 'B',
      logName() { console.log(this.name); },
      arr: [
        {
          name: '666',
          logName() { console.log(this.name); },
        },
        function() { console.log(this.name); },
      ],
      c: {
        name: 'C',
        logName() { console.log(this.name); },
      },
    },
  },
});

obj.a.b.c.logName(); // Root
obj.a.b.logName(); // Root
obj.a.logName(); // Root
obj.a.b.arr[0].logName(); // Root
obj.a.b.arr[1](); // Root
Ответ написан
VoidVolker
@VoidVolker Куратор тега JavaScript
Dark side eye. А у нас печеньки! А у вас?
class Foo 
{
    constructor() {
        this.key1 = 'key 1'
        this.bar = new Bar(this)
    }
}

class Bar {

    constructor(parent) {
        this.parent = parent
    }

    redner() {
        console.log('Parent key 1:', this.parent.key1)
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы