JavaScript の継承についての質問です。

JavaScript の継承で親クラスのメソッドをオーバーライドした場合、子クラスのメソッドから親クラスのメソッドを呼び出す事は出来ますか?
例えば、Java で言うsuperを使ったアクセスのような機構です。

回答の条件
  • 1人2回まで
  • 登録:2008/12/11 13:38:29
  • 終了:2008/12/17 01:01:10

回答(3件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/12/11 15:03:24

ポイント27pt

JavaScriptには、明確な「継承」機能がありません。

メソッドの継承は可能ですが、継承先の prototype プロパティに明示してやる必要があります。

具体的なコード例は「メソッドの継承」をご覧下さい。

id:norisuke3

昨日、これを読んでJavaScriptの継承について学んでいた所です。

親クラスのプロトタイプのプロパティーを全て子クラスのプロトタイプにコピーした後、子クラスで挙動を変更したいメソッドを書き変えるのがオーバーライドなわけですが、そのオーバーライドした子クラスのメソッドから親クラスの同名のメソッドにsuperのような感じでアクセスする方法は有りますか?というのが質問の趣旨です。

例えば、親クラスのメソッドで親クラスのプロパティーを操作していた場合、それをオーバーライドしてしまった後、プロパティーに対する同じ操作を子クラスに再度記述せずに実行する方法があるのかというのが疑問に思った点です。

2008/12/11 15:27:56
id:den2sn No.2

den2sn回答回数14ベストアンサー獲得回数52008/12/11 15:36:17

ポイント27pt

そもそもの話になりますが、JavaScriptに継承はありません。

そしてJavaのsuperのようなキーワードもありません。


プロトタイプを使用するのであれば

プロトタイプを直接呼ぶことで以下のようなことは可能かと思います。


function oya() {
    this.hoge = function(){alert('oyahoge');}
}
function ko() {
    this.hoge = function(){ko.prototype.hoge();alert('kohoge');}
}
ko.prototype = new oya();

function init() {
    var koObj = new ko();
    koObj.hoge();
}

以下のサイトが参考になるかと思います。

http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/...

id:norisuke3

なるほど。ko.hoge()をkoのprototypeのプロパティーとしてではなくて、koのプロパティーとして保持すると言う事ですね。なるほどこれなら確かにoya.hoge()も呼べますね。

ありがとうございました。

2008/12/11 15:49:47
id:atmarkbienna No.3

atmarkbienna回答回数61ベストアンサー獲得回数32008/12/11 18:04:09

ポイント26pt

これはうちで使ってるinherit関数です。

これで

super_c.test = function() {alert(1);}

inherit(this,super_c);

this.parentObject.test();

見たいな処理が出来ます。

/**

* クラスを継承

*

* @example function X()

* {

* inherit(this, Super_Class);

* }

* @param {object} subClass 継承先クラス

* @param {oeject} superClass 継承元クラス

*/

function inherit(subClass, superClass) {

subClass.parentObject=superClass;

subClass.parentObject();

function createDelegate(func, thisObj){

var del=function(){

return func.apply(thisObj, arguments);

};

del.func=func;

del.thisObj=thisObj;

return del;

}

var prop;

for(prop in subClass){

subClass.parentObject[prop] = createDelegate(subClass[prop], subClass);

}

}

id:norisuke3

まだまだ修行が足りない為、今の私には完全に理解する事が出来ませんでした。

まず、inherit関数の2行目で、何故parentObject() (= super class のコンストラクタ?)を呼んでいるのかがわかりません。

それから、最後の部分で、subclassのデリゲートをsubclass.parentObjectにコピーしているようですが、これはsubclassで定義されたメソッドをsubclass.parentObjectにコピーすると言う事ですか?どうしてそうするのかも理解できませんでした。

最後に、delegateのfuncとthiObjというプロパティーは、どこからも利用されていないように見えるのですが、これは何れ何処かで使用される事を想定しての事ですか?

可能なら教えていただけると大変嬉しいです。よろしくお願いします。

2008/12/14 14:16:43

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません