Область функции обратного вызова в «новом» на литерале объекта JS - PullRequest
1 голос
/ 07 июля 2019

В этом коде функция обратного вызова получает область действия нового объекта Thing (как показывает рецензия, регистрируется Thing.) Использование функции стрелки заставляет ее регистрировать объект окна.

Я бы хотел иметь возможность доступа к области действия объекта literal в этой функции обратного вызова, в идеале, без ссылки на него из глобального объекта.Есть ли способ сделать это?

function Thing(fun){
    this.funThing = fun
}

let literal = {
    thing: new Thing(function(){
        console.log(this)
    })
}

literal.thing.funThing() // Thing {funThing: ƒ}

Ответы [ 3 ]

1 голос
/ 07 июля 2019

Вместо этого вы можете использовать геттер, главное отличие здесь в том, что при каждом доступе вещь будет воссоздана, но хорошо, что вы сможете преодолеть ее по-другому;)

И да, я изменил еек функции стрелки здесь, но я мог бы также привязать функцию обратного вызова

function Thing(fun){
    this.funThing = fun
}

let literal = {
    get thing() {
      return new Thing(() => {
        console.log(this)
      });
    }
}

literal.thing.funThing()
1 голос
/ 07 июля 2019

Раствор lcepickle работает отлично. Другой способ - связать функцию обратного вызова с литеральным объектом, но в этом случае вы должны определить его перед вызовом конструктора new Thing. Таким образом, вы можете добавить атрибут thing после определения литерального объекта:

function Thing(fun){
    this.funThing = fun
}

let literal = { }
literal.thing = new Thing(function(){
    console.log(this)
}.bind(literal))

literal.thing.funThing()
0 голосов
/ 07 июля 2019

Вы можете привязать функцию анонимного обратного вызова к области действия объекта literal.

function Thing(fun){
    this.funThing = fun
}

literal = {
    thing: new Thing(function(){
        console.log(this)
    }.bind(this.literal))
}

literal.thing.funThing()
...