オブジェクト指向javascriptにおける親関数の呼び出し
親という言い方はおそらく不適切な気がしますが、メイン言語がjavaなのでその辺は大目に見てください。
今回やりたかったのは、javaで書くと以下のようなもの。つまりオーバーライドした側でもともとの定義の処理を呼び出したい!
public int someMethod() { return super.someMethod() * 2; }
今回の雛形となるjavascriptは以下。「どう書く?」のところをどうかくか。
function USER(){}; USER.prototype.someMethod = function() { return 1; } var user = new USER(); console.info("変更前:" + user.someMethod()); user.someMethod = function() { // どう書く? } console.info("変更後:" + user.someMethod());
自分自身を呼び出す
最初に考えたのは以下。
user.someMethod = function() { return this.someMethod() * 2; }
ただし、エラーが発生。too much recursionだってさ。。
自分自身を呼び出さなければいいのでは
このエラーを見てひらめいたのは以下。
var user = new USER(); user.hoge = user.someMethod; user.someMethod = function() { return user.hoge() * 2; }
一度別な名前で定義しなおしたらいけるんじゃない?と思ったらいけました。出来ました!!
・・・けど微妙。
素直にやってみた
user.someMethod = function() { return USER.prototype.someMethod() * 2; }
ということで出来ました!多分これが正しいと思う。
と思ったらダメなパターンがあった
function USER(age){ this.age = age; }; USER.prototype.getAge = function() { return this.age; }
こんなケースにおいて、先ほどのようなやり方はうまくいかない。
user.getAge = function() { return USER.prototype.getAge() * 5; }
やっぱり関数を別定義するやり方しかないかな。