Function.prototype для метода не передает this объекта - PullRequest
1 голос
/ 03 мая 2020

Прежде всего, извините за мой плохой английский sh.

Я хочу создать прототип для класса Function, например: (пример задержки)

import { delay } from 'lodash';

export default function(
    this: (...args: any) => any,
    wait: number,
    ...params: [any]
  ): any {
  return delay(this, wait, ...params);
};

I ' мы применили его, и когда я вызываю его из функции, она хорошо работает:

console.log('render');
console.log.delay(1000, 'delayed render');

, но когда я вызываю его из метода, это не проходит:

class Test {
  constructor() {
    this.consoleLog('render');                      // Test {} render
    this.consoleLog.delay(1000, 'delayed render');  // undefined delayed render
  }
  consoleLog(text) {
    console.log(this, text);
  }
}

Как можно Я передаю «это» чисто?

1 Ответ

0 голосов
/ 03 мая 2020

Я не верю, что проблема заключается в вашем прототипе задержки, это контекст, в котором вызывается console.log в методе consoleLog.

Если вы определите его таким образом, вы посмотрите контекст, который вы хотите:

class Test {
  constructor() {
    this.consoleLog = this.consoleLog.bind(this);
    this.consoleLog('render');                      
    this.consoleLog.delay(1000, 'delayed render');
  }
  consoleLog(text) {
    console.log(this, text);
  }
}

Я верю, что происходит то, что delay вызывается в контексте consoleLog, а поскольку delay в конечном счете вызывает то, что this(params) не имеет контекст (недоступный через объект - то есть consoleLog('delayed render') вместо someObj.consoleLog('delayed render')), таким образом undefined. Я надеюсь, что это имеет смысл.

Чтобы нарисовать его с помощью псевдо стека трассировки:

Normal execution context:
const test = new Test()
test.consoleLog('abc')
-> consoleLog gets called in the context of `test`
-> console.log thus displays `Test` as the object `this` is referring to

Delayed execution context:
const test = new Test()
-> delay gets called with consoleLog as `this`
-> this(params) gets executed (consolLog(params))
-> since consoleLog was not called ON an object (see test.consoleLog above)
its context is undefined in strict mode, thus `console.log(this, text)` will
show `undefined "delayed render"`

...