🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

解決済

1回答

668閲覧

JavaScriptのプロトタイプにメソッドを追加する方法がわかりません

r.s_09

総合スコア17

JavaScript

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

0グッド

2クリップ

投稿2021/03/28 16:20

前提・実現したいこと

現在、「Modern JavaScript for the impatient」という本の翻訳版を読んでいます。
その本の第4章の演習問題5問目のJavaScriptの問題がわからず詰まっています。
助言いただければと思い、質問を投稿させて頂きます。

分からない演習問題5問目

次の関数は、文字列greetメソッドを追加して「あいさつ」ができるようにする。

JavaScript

1function createGreetable (str) { 2 const result = new String(str) 3 result.greet = function(greeting) { return `${greeting}, ${this}` } 4 return result 5}

典型的な用例は、

JavaScript

1const g = createGreetable('World') 2console.log(g.greet('Hello'))

この関数には、1つ難点があって、あいさつができる文字列は、それぞれgreetメソッドの独自のコピーをもつことになる。createGreetableが、プロトタイプにgreetメソッドを含むオブジェクトを作成するように仕様。それでも、すべての文字列メソッドを呼び出せるようにする。

以上が問題になります。

考えたソースコード

JavaScript

1const greetPrototype = { 2 greet: function(greeting) { 3 let result = '' 4 for (const key in this) { 5 result += this[key] 6 } 7 return `${greeting}, ${result}!` 8 } 9} 10 11function createGreetable(str) { 12 const result = new String(str) 13 Object.setPrototypeOf(result, greetPrototype) 14 return result 15} 16 17const g = createGreetable('World') 18console.log(g.greet('Hello'))

上記のソースコードの出力結果

Hello, Worldfunction(greeting) { let result = '' for (const key in this) { result += this[key] } return `${greeting}, ${result}!` }!

試したこと

問題の意味がうまく理解できていないのもありますが、
まずは、greetPrototypeを作成し、greetメソッドを追加しました。
greetメソッドでは、thisを使ってStringオブジェクトの内容を表示したかったのですが、うまくできなかったためfor inを使ってresult変数に代入し表示しています。
その値を、Object.setPrototypeメソッドでプロトタイプに追加し、使えるように実装しました。
結果、Hello, Worldの表示後、greet: の次に書いたプロトタイプのgreetメソッドのソースコードが表示されてしまいました。

初歩的な問題だとは思いますが、よろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

node: 12.18.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

greetメソッドのソースコードが表示されてしまいました。

for in で greet の内容も表示しているためです。
ちゃんとgreetをプロトタイプに入れればthisが使えます。

以下のコードではString型のプロトタイプを変更していますが、問題の意図はもしかしたらStringを継承した型を作れということかもしれません。

js

1function createGreetable(str) { 2 const result = new String(str); 3 const proto = Object.getPrototypeOf(result); 4 proto.greet = function(greeting) { 5 return `${greeting}, ${this}!`; 6 }; 7 Object.setPrototypeOf(result, proto) 8 return result 9}

初歩的な問題だとは思いますが

まったく初歩的ではないと思いますよ。今どきのJavaScript初学者がプロトタイプ操作を学ぶ必要はありません。


参考までに、いまどきのJavaScriptなら以下のようにclassでやります。

javascript

1class MyString extends String { 2 greet(greeting) { 3 return `${greeting}, ${this}!`; 4 } 5} 6const g = new MyString('World'); 7console.log(g.greet('Hello'));

投稿2021/03/28 16:54

編集2021/03/28 17:21
int32_t

総合スコア21679

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

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

r.s_09

2021/03/29 01:36 編集

ありがとうございました!解決できました! thisの挙動を理解していないこと、getPrototypeOfメソッドについての見落としなど、反省点が多く見つかりました。 教材ではclassを使いましょうと書いてあるのですが、裏では何が行われているのか把握した方が良いという意図からprototypeを使っている、そうです。非常に勉強になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問