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

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

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

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

Q&A

解決済

3回答

918閲覧

Object.assignを用いたコンストラクタの初期値設定について

kabatiro

総合スコア20

JavaScript

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

0グッド

0クリップ

投稿2020/08/18 09:42

js

1class Member { 2 constructor(firstName, lastName) { 3 Object.assign(this, {firstName, lastName}); 4 } 5 getName() { 6 return this.lastName + this.firstName; 7 } 8} 9 10let m = new Member('太郎', '山田'); 11console.log(m.getName()); //結果 山田太郎

上記のコードの中の

js

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

このコードでなぜうまくいくのかがわからないです。特にthisの中身がわからないです。少し曖昧な質問なのですが直接の答えでなくとも、参考となるサイトなど教えていただけたら大変ありがたいです。よろしくお願いします。

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

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

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

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

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

guest

回答3

0

new Member('太郎', '山田') すると新たなオブジェクトが作られます.
作られたオブジェクトが this にセットされた状態で constructor() が呼び出されます.

JavaScript における this は色々罠があったりちょっと複雑なので詳しくはきちんと調べて欲しいですが,
このコードのその場所で使われている this は作成されたばかりの新しい Member オブジェクトです.

{firstName, lastName} はオブジェクト初期化子ですが, JavaScript のバージョン ES2015 から導入された Shorthand property names を使っています.
それ以前のバージョンの表記で書くと {firstName: firstName, lastName: lastName} です.
プロパティ名と内容が一致する場合に省略可能になったんですね.

Object.assign() は最初の引数のオブジェクトに対して, 次の引数のオブジェクトのメンバをコピーします.
この場合は {firstName, lastName} の各メンバを, 作られたばかりの Member オブジェクトの同じ名前のプロパティへ代入します.

JavaScript

1// Object.assign() の動作イメージ 2const o = {firstName, lastName}; // {firstName: '太郎', lastName: '山田'} 3this.firstName = o.firstName; 4this.lastName = o.lastName;

結果, 作られたばかりの Member オブジェクトはめでたく firstNamelastName で初期化されることになります.

投稿2020/08/18 10:20

kagilinn

総合スコア354

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

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

kabatiro

2020/08/18 12:56

なるほどです!丁寧に解説していただきありがとうございます!!
guest

0

ベストアンサー

特にthisの中身がわからない

コンストラクタ中のthisは、大雑把に言うと何も入っていないオブジェクトです。
いろいろあるのですが、簡単のために誤解を恐れずに言えば、{}と同じです。
なので、以下のような意味だと理解して、おおむね間違いありません。

js

1Object.assign(this, {firstName, lastName}); 2// ↑これはこう考えるとわかりやすい↓ 3Object.assign({}, {firstName, lastName});

ちなみに、{firstName, lastName}の部分は、以下のような意味です。

js

1{firstName, lastName} 2// ↑これは等価↓ 3{firstName:firstName, lastName:lastName}

投稿2020/08/18 10:03

Lhankor_Mhy

総合スコア36074

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

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

kabatiro

2020/08/18 10:16

ありがとうございます!理解できました!
kagilinn

2020/08/18 10:23

実際には `Object.assign({}, {firstName, lastName});` だと変更後のオブジェクトが捨てられてしまうことに注意ですね.
Lhankor_Mhy

2020/08/19 01:07

おっしゃるとおりです。
guest

0

このコードでなぜうまくいくのかがわからないです。

これは、以下のコードと概ね同じ意味です。

javascript

1this.firstName = firstName; 2this.lastName = lastName;

特にthisの中身がわからないです。

コンストラクタで作成中のオブジェクトです。

投稿2020/08/18 10:03

maisumakun

総合スコア145183

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

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

kabatiro

2020/08/18 10:17

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問