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

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

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

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

Q&A

解決済

2回答

8726閲覧

JSクラスの処理を上書きしたい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2018/04/05 11:28

編集2018/04/06 00:00
var test = function(){ this.var = "hoge"; alert(this.var); } $(function(){ new test(); });

上記クラスが書かれたJSファイルがあります。このファイルは触ることができないが、処理を上書いて「this.var="geho"」としたい場合、どのような方法があるのでしょうか?

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

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

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

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

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

defghi1977

2018/04/05 11:34

要するに, new test()で「geho」をポップアップさせたいということですか?
退会済みユーザー

退会済みユーザー

2018/04/05 12:08

要はそうですが、基本的に既存クラスはどうやって書き換えるのかを気になって質問です
defghi1977

2018/04/05 12:09

クラスの継承ってこと?
guest

回答2

0

ベストアンサー

目的が判らんけれど例えばこんな

  • test関数のプロトタイプを記事ってvarプロパティから得られる値をgehoに固定する

JavaScript

1{ 2 let test = function(){ 3 this.var = "hoge"; 4 alert(this.var); 5 } 6 7 Object.defineProperty(test.prototype, "var", {get: () => "geho"}); 8 new test(); 9}
  • testクラスをソースコードレベルで書き換える

JavaScript

1{ 2 let test = function(){ 3 this.var = "hoge"; 4 alert(this.var); 5 } 6 7 test = eval(test.toSource().replace("hoge", "geho")); 8 new test(); 9}

投稿2018/04/05 11:46

defghi1977

総合スコア4756

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

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

0

再初期化

シンプルに、変数を初期化し直せばいいのでは。

JavaScript

1var test = function(){ 2 this.var = "geho"; 3 alert(this.var); 4};

予約語

var は予約語で IE8- にはプロパティ名にも予約語を指定できない仕様がありました。
最近のブラウザでは問題ありませんが、参考まで。

関数コードの書き換え

関数コードを書き換える事は不可能です。

変数の参照値を書き換える事で疑似的に書き換えているかのように振舞う事は可能です。
ただし、元々の参照値は変えようがない為、test.prototype など、test が参照しているコード、testを参照しているコードを全て、新参照値に書き換える必要があります。

クラス自体を再定義するということは実際の運用では効率的でない気がします。

そのままのクラスで動作するようにコードを書くのが最も効率的です。
この質問は効率を落とした解決策を求めています。

最も、私としては「関数コードを書き換える」という要件が安全でなく、効率以前の問題のように感じていますが…。
私なら、関数コードを書き換えずに済む方法を模索します。

Re: realmccoy さん

投稿2018/04/06 05:25

編集2018/04/06 07:16
think49

総合スコア18162

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

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

退会済みユーザー

退会済みユーザー

2018/04/06 06:33

当該クラスは触ることができない前提で。 クラス自体を再定義するということは実際の運用では効率的でない気がします。
think49

2018/04/06 06:35

クラス定義の記述には手を入れず、後述で変数を再定義してはどうか、という提案です。 const ではないので、変数の再代入が許されているように読めます。
defghi1977

2018/04/06 06:39

> クラス自体を再定義するということは実際の運用では効率的でない気がします。 というより, あなたの「JSクラスの処理を上書きしたい」が意図しているところが意味が判らないので答えようがないのですよ. クラスの再利用なら判りますが、クラスの「改変」に拘る理由をお聞かせ願いたい.
think49

2018/04/06 07:17

親記事に [関数コードの書き換え] を追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問