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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

JavaScript

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

Q&A

解決済

1回答

1908閲覧

ES2015のコンストラクタと結合

aaaaaaaa

総合スコア501

ECMAScript

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

JavaScript

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

0グッド

0クリップ

投稿2016/10/07 10:59

ES2015からPHPのようなインスタンス実行時に自動で処理される特殊なメソッドであるコンストラクターが作れるそうです。そのjavascriptにおけるコンストラクターとは、Objectオブジェクトのassignという、第二引数以降に指定した引数が持っているメンバを第一引数に結合(複製?)させるメソッドを使うことでコンストラクターでよく利用する関数等で使う初期値の設定を単純に表現できるそうです。

javascript

1constructor(firstName,lastName) { 2 Object.assign(this,{firstName,lastName}); 3}

このような単純に表現する方法を記述した書籍Javascript本格入門によれば

コンストラクター配下では、thisが現在のインスタンスを渡すので、これに引数をまとめたオブジェクトリテラルをまとめて結合しているわけです。<略>初期化すべき値が増えた場合にも同じような代入式を列記しなくて済む<略>

ここで質問がいくつかあります。

コンストラクター配下でthisがインスタンスを参照するのは、変数thisがメソッド内にあるとレシーバオブジェクト、つまり呼び出し元のオブジェクトを指すからですか。


いわゆるインスタンスの元となるクラスつまりコンストラクタと、上述のコンストラクタは、呼び名が同じだけで中身は全く違うものですか。


引用文の「thisが現在のインスタンスを渡すので、これに引数をまとめたオブジェクトリテラルをまとめて結合しているわけです」というのは、何らかの理由でthisがインスタンスを参照しているので、このインスタンスにconstructorの引数でありインスタンスの初期値となるfirstName、lastNameを{x:1,y:0}のようなオブジェクトリテラルとしてまとめ、インスタンスに渡している、ということであっておりますか。しかしいまいち結合したものをインスタンスに渡す利点がわかりません。

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

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

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

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

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

guest

回答1

0

ベストアンサー


違います。コンストラクタはnewによってインスタンス化されるときにインスタンスを初期化するために呼び出されますが、変数thisは新しく作られたインスタンスを指します。コンストラクタ呼び出し直後はthisは空っぽで、「thisを使ってオブジェクトのプロパティを追加・設定をしてください」という意味でthisがコンストラクタに渡されます。

クラス名とコンストラクタ名は同名ですが意味が違います。しかし、クラス名と同名のコンストラクタとconstructorは全く同じものです。

一般にコンストラクタの引数と同名・同値のプロパティを追加・設定することが多いです。その場合、

JavaScript

1constructor(firstName, lastName, birthday, address) { 2 this.firstName = firstName; 3 this.lastName = lastName; 4 this.birthday = birthday; 5 this.address = address; 6}

上記のように書いて全く問題ありませんが、同じ単語が現れて書くことがちょっと面倒くさい。だから、
同じ内容を

JavaScript

1constructor(firstName, lastName, birthday, address) { 2 Object.assign(this, {firstName, lastName, birthday, address}); 3}

と書いた方がタイプ量が少なくて済むので楽ですよね、という意味です。
assignとは「代入する」という意味で、Object.assign()は「第2引数のオブジェクトを第1引数のオブジェクトへ(代入)コピー」します。
thisはまさにオブジェクトなので、第2引数も{ }で括ってオブジェクトにしてあげましょう、ということです。

投稿2016/10/09 03:34

naomi3

総合スコア1105

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問