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

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

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

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

Q&A

解決済

1回答

437閲覧

条件によって実行する関数を変更することを、変数に関数名を代入することで成し遂げたい

meron-pan

総合スコア44

JavaScript

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

0グッド

0クリップ

投稿2020/02/18 14:02

編集2020/02/18 14:03

前提・実現したいこと

canvasでテキスト描画を行う際に、「fillTextかstrokeTextのどちらかの関数を実行するかが決まっているメソッド」を持ったクラスを作り、fillかstrokeかを気にせずにテキスト描画を実行しようと思いました。
そのために、変数にテキスト描画関数を代入し、その変数を操作することで、fillかstrokeかを変更できるようなコードを設計し実行したところ、エラーが発生してしまい困っています。エラー内容から関数として実行しているのは理解できたので、ある程度は予想通りの結果が得られたのですが、なぜ呼び出した関数がcanvasの関数ではないのかが理解できず、解決策がわかりません。

ソースコードはマウスクリックでテキスト描画が行うようになっています。

発生している問題・エラーメッセージ

TypeError: 'fillText' called on an object that does not implement interface CanvasRenderingContext2D.

該当のソースコード

javascript

1let canvas; 2let ctx; 3canvas = document.createElement('canvas'); 4canvas.width = 500; 5canvas.height = 500; 6 7document.body.appendChild(canvas); 8ctx = canvas.getContext('2d'); 9 10class Text{ 11 constructor(ctx){ 12 this.ctx = ctx; 13 this.drawText = this.ctx.fillText; 14 } 15 16 draw(mes, x, y){ 17 this.drawText(mes, x, y); 18 } 19} 20 21let text = new Text(ctx); 22canvas.addEventListener('click', function(){ 23 text.draw('ナナナ', 50, 50); 24})

試したこと

一番簡単な解決策として、メソッド内にif文による条件分岐を設けることによって描画方法を切り替えるやり方がありますが、今回はそれ以外のやり方としてこの方法での解決策を探しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

JavaScriptの場合、メソッドを変数に代入してから呼ぶと、thisが変化してしまいます。

javascript

1foo.bar(); // メソッド内でのthisはfoo 2 3const method = foo.bar; 4 5method(); // メソッド内のthisはfooと無関係

thisを変更したくない場合、Function.prototype.bindMDN)を使ってthisを固定しましょう。

javascript

1this.drawText = this.ctx.fillText.bind(this.ctx);

投稿2020/02/18 14:12

maisumakun

総合スコア145952

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

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

meron-pan

2020/02/18 14:23

ありがとうございます。メソッドを変数に代入した書き方をしたことがなかったので、thisがこの場合でも変化することを知りませんでした。thisが変化した場合は、たいてい「関数 is not function」みたいな文言だったので、thisが問題だったとは知りませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問