Sintassi della classe Javascript e associazione nei metodi [duplicato]

Dec 09 2020

Volevo capire la differenza fondamentale tra il funzionamento della sintassi seguente.

// Syntax 1
class Component extends React.Component {
  constructor(props) {
    super(props)
    this.handleClick = this.handleClick.bind(this)
  }

  handleClick() {
    // ...
  }
}

// Syntax 2

handleClick = () => {
  console.log('this is:', this)
}
<button onClick={this.handleClick}>
  {'Click me'}
</button>

Mentre la sintassi 1 necessita di un'associazione esplicita da specificare all'interno del costruttore. Tuttavia, sembra che con la sintassi 2 non sia necessario. In che modo la sintassi 2 è in grado di ottenere l'associazione automaticamente?

Presumo che questa comprensione / sintassi possa essere estesa a qualsiasi framework inclusi React, Angular, Ember, ecc

Risposte

1 CertainPerformance Dec 09 2020 at 11:52

I campi di classe, ovvero le proprietà definite direttamente all'interno del corpo della classe, sono essenzialmente solo zucchero di sintassi per la stessa cosa all'interno del costruttore. Così questo:

class Something {
  handleClick = () => {
    console.log('this is:', this)
  }
}

è, desugared:

class Something {
  constructor() {
    this.handleClick = () => {
      console.log('this is:', this)
    };
  }
}

Una volta rimosso lo zuccheraggio, dovrebbe essere chiaro cosa sta succedendo: la funzione freccia significa che si thisriferisce a ciò che thisè nel costruttore, che è l'istanza stessa, non è necessario alcun legame.

Questa non è solo una cosa React o framework: queste sono regole standard in JavaScript vanilla.

Se non vincoli il metodo o usi una funzione freccia o qualcosa del genere, allora:

<button onClick={this.handleClick}>

fallisce per lo stesso motivo

someButton.addEventListener('click', myObj.someFn)

inoltre non riuscirà a chiamare someFncon un contesto di chiamata di myObj: tutto ciò che il browser sa è chiamare la richiamata passata al click listener; il contesto di chiamata di myObjsi perde quando viene passato in questo modo.