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

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

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

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

Q&A

解決済

1回答

1104閲覧

JSで、オブジェクトのプロパティに関数を渡したい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2017/06/10 16:00

編集2017/06/10 16:02

自分で新しく定義したオブジェクトを生成する時に、プロパティとして関数を渡し、コンストラクタでプロパティとして持たせたいです。
下記のようなコードを書いたのですが、2つうまくいきません。

実際のコード

// 1. 最終的に実行したい関数 function myFunc(myArg){ alert("executed " + myArg); } // 2. MyObjectオブジェクトのコンストラクター MyObject = function(func){ console.log(func); // 1つ目: undefinedと表示されてしまう。(3で実行される) this.func_as_property = func; } // 3. MyObjectインスタンスの生成 var obj = new MyObject(myFunc("arg")); // 2つ目: ここで関数が実行されてしまう。 // 4. MyObjectのexecメソッドを定義 MyObject.prototype.exec = function(){ this.func_as_property(); } // 5. execメソッドからmyFunc()を実行 obj.exec();

問題点

  • 1つ目はオブジェクトのプロパティとして渡したはずの関数が渡されておらず、console.logで表示してみてもundefinedと表示されてしまう
  • 2つ目はプロパティとして渡したくてそこに書いているので実行して欲しくないが渡そうとするタイミングで関数が実行されてしまう

お聞きしたいこと

  • オブジェクトのコンストラクタに引数としてどうやって関数を渡すか
  • インスタンス生成時に引数に指定した関数をその場で実行してしまわないようにするにはどうすればいいか

2点です。よろしくお願いします。

引数,プロパティ,オブジェクト,インスタンスなど、言葉の使い方が間違っていたら申し訳ないです。

実際にやりたいこと(読んでもらう必要はないです)

フレームワークは使わずに、jsで簡単なクリッカー系放置ゲームを作っています。
このようなゲームをプレイしたことのある方はわかると思いますが、アップグレード系のアイテムがあり、毎秒の生産を2倍や10倍にしたり、1クリックあたりの生産を毎秒あたりの自動生産の3%増やす、などとても多種多様な効果を持つ事になります。
なのでアップグレードの効果関数をオブジェクトのプロパティとして持ち、アップグレードが購入されたタイミングで実行したいです。
色々他の方法も考えられますが、なんとなくこの方法がスマートかなと思いました。他にどんな方法が考えられるか、いい方法を知っている方、思いついた方、本来の質問に答えてもらわなくても結構なので、ぜひ教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

JavaScript

1// var obj = new MyObject(myFunc("arg")); 2// ↓ 3 var obj = new MyObject( myFunc );

追記:
"arg" を先に渡しておきたいのね。それなら上記は無視で。

JavaScript

1function myFunc(myArg){ 2 return function() { alert("executed " + myArg); }; 3}

投稿2017/06/10 16:04

編集2017/06/10 16:06
kei344

総合スコア69364

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

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

退会済みユーザー

退会済みユーザー

2017/06/10 16:13

確かに渡せました! でもそれだと引数を持たせることができなくなってしまいますよね? 書いてなくて申し訳ないんですが、myFuncでの引数の数は定まってないので、一緒に渡してしまいたいのですが... それか // var obj = new MyObject( myFunc("arg1", "arg2") ); var obj = new MyObject( myFunc, ["arg1", "arg2"] ); みたいな書き方ができればいいのですが、可変長配列を引数にうまく渡す方法がわかりません...
退会済みユーザー

退会済みユーザー

2017/06/10 16:21

全て解決しました! とても素早いご回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問