0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【javascript】クラスについて

Last updated at Posted at 2020-07-17

この記事は以下の書籍を参考にして執筆しました。

class DaStore {
  fetch() {
    //ajaxのコールバックとしてthis.callbackを指定
    ajax(this.url, this.callback);
  }
  callback(records) {       //このメソッドはバインドされないため
    this.records = records // thisキーワードは
                          // このインスタンスを指していない
  }
}

出典:入門JavaScriptプログラミング

##解決法

###アロー関数を使用する

class DaStore {
  fetch() {
    ajax(this.url, records => this.records = records);
  }
}

#superキーワード
スーパークラスのコンストラクタやメソッドの呼び出しを可能にする。
##コンストラクタでのthisの参照
コンストラクタでsuperを使う場合、thisを参照する前にsuperを呼び出すに必要がある。
##使い方

super.プロパティ名
super.メソッド名()

#クラス拡張時の注意
クラスのプロパティにアロー関数を参照させることでメソッドをバインドできる。

class DataStore {
  fetch() {
    ajax(this.url, this.callback)
  }
  callback = (records) => {
    //処理
  }
}

出典:入門JavaScriptプログラミング

callbackメソッドはDataStoreプロトタイプに追加されない

callbackメソッドは作成されたインスタンスに直接追加される

つまりsuprは使えない。
サブクラスでこのメソッドを使いたい場合どうするか。

対策としては
実際のメソッドとして定義して
コンストラクタの中でインスタンスにバインドする
というものがある

class DataStore {
  constuctor() {
    //プロトタイプのcallbackメソッドをインスタンスにバインド
    this.callback = this.callback.bind(this)
  }
  fetch() {
    ajax(this.url, this.callback)
  }
  callback(records) {
    //処理
  }
}

class SubStore extends DataStore {
  callback(records) {
    super.callback(records)
  }
}

出典:入門JavaScriptプログラミング

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?