人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: norisuke3
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Java JavaScript アクセス オーバー クラス
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●27ポイント

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

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

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

◎質問者からの返答

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

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

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


2 ● den2sn
●27ポイント

そもそもの話になりますが、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/...

◎質問者からの返答

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

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


3 ● atmarkbienna
●26ポイント

これはうちで使ってる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);

}

}

◎質問者からの返答

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ