質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

579閲覧

[JS]ES2015のclass利用時のメソッド間の変数引き渡しについて

rontec

総合スコア169

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

2クリップ

投稿2017/11/29 11:26

編集2017/11/29 11:48

JSのコーディングについてご相談させて頂きます。

JSのコーディングでようやくES2015を本格的に取り入れようと本腰をあげました。
Javaも利用しており、JSでも普段からprototypeなどを利用した書き方をしていたので、class
の概念導入は当初特に問題なかったのですが、引数の受け渡し方法で悩んでいます。

class内のコンストラクタでプロパティをthisに紐付けて設定するかと思いますが、
class内でメソッドが他メソッドを呼ぶ時、以下受け渡し方法を想定しています。

  • 通常通り引数で受け渡す
  • thisにプロパティとして紐付け、渡したい先のメソッドでthisから参照する

当初前者で考えていたのですが、eslintがthisを利用していないメソッドに警告を出す
ことから、thisを参照するように作ったほうが良いのかと悩んでいます。

確かにAngularなどを使った時などに値を中央一括管理して画面に反映するように、なるべく
this内に集約した方が確かに良いような気もします。


またもう一件、class内でどのタイミングでもthisにプロパティを追加出来ることが
少し気持ち悪く感じておりますが、こんなものなのでしょうか。
出来れば感覚的にはJavaのプロパティ宣言のように、宣言したものだけしかプロパティ
設定出来ないようしたいと考えています。
コンストラクタ内でthisに紐付けたプロパティ以外、他メソッド追加出来ない
とかの制限は出来ないのでしょうか。
Objectの場合は、よく拡張禁止にObject.preventExtensionsを使っていたのですが…。

なお、本プロジェクトは残念ながらフレームワークの導入はしておりません。


現物のソースコードは投稿出来ないのですが、以下のようなイメージです。

javascript

1class Page { 2 constructor() { 3 // もろもろconstructorでプロパティ定義。 4 this.id = null; 5 this.name = null; 6 } 7 8 controller() { 9 this.getData(() => { 10 // 取得したデータの表示処理 11 draw(); 12 }); 13 } 14 15 getData(callback) { 16 // Ajaxでサーバーからデータ取得 17 const data =; 18 // 非同期についてはさておき、ajax通信後に以下が実行されるとします。 19 // 取得したデータをthisに紐付け 20 this.id = data.id; 21 this.name = data.name; 22 callback(); 23 } 24 25 draw() { 26 // this.idとthis.nameを画面描画 27 // 引数はなく、thisから参照します。 28 } 29} 30 31const page = new Page(); 32page.controller();

※テキストエディタにぱぱっと書いたものなので、書式のミスがあるかもしれません。
※なお、以上のソースは「thisにプロパティとして紐付け、渡したい先のメソッドでthisから参照する」のイメージです。

sota_u👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2017/11/29 11:28

具体的なソースは提示できますか?
rontec

2017/11/29 11:43

すみません、職場のソースコード、かつ職場からのコードの外部持ち出しが厳しいので、現物は投稿出来ないのですが、大体のイメージを追記します。
guest

回答1

0

ベストアンサー

他メソッドへの変数受け渡しについて。

そのメソッド内でthisを使用しなくてよい場合(提示されたサンプル中のgetData()?)は、クラスのメソッドではなく通常の関数として切り出して宣言するというのはいかがでしょうか?

切り出した関数を宣言する場所ですが、クラス外のほかには、1メソッド内からしか呼ばれない関数であればそのメソッドの中で宣言するという手もあります。
モジュール機能(ES2015、CommonJS問わず)をお使いでしたら、クラス外での宣言でもexportしなければ元のクラスへの帰属性をアピールできるかと思います。


Object.preventExtensions は初めて知りましたが、class構文は基本的に従来のprototypeによるOOPの糖衣構文ですので、classで作ったオブジェクトにも利用できるはずです。
手元のnodejsで確認したところ、constructorの末尾の Object.preventExtensions(this) や、クラス宣言後の Object.preventExtensions(Page.prototype) 等もうまく動作しました。

投稿2017/11/29 13:50

lefb766

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rontec

2017/11/30 14:40

メッソド内の宣言については私もよく考えるのですが、1メソッドが長くなってしまうことと、多機能化してしまうのが悩みどころですね…。 でもここでしか使わないからなと、結局そうしてしまうこともありますが笑 いっそclassの外に出してしまう発想はありませんでした。 ただこれもそのclassでしか使わないことを考えると悩ましいですね。 選択肢が広がったので、もう少し考えてみようと思います。 ご教示頂き、ありがとうございました。 --- thisをObject.preventExtensionsで囲う件に関しては、出来たらいいのになぁと考えていたはいたのですが、勝手に出来ないと思いこんで試していませんでした。 まさか出来るとは…と目から鱗でした、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問