Graviness Blog

算数・数学・科学・電脳・雑記・アホの順の密度で記事が構成されます。
<< April 2020 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >> ブログランキング・にほんブログ村へ
 
RECOMMEND
ビッグバン宇宙論 (上)
ビッグバン宇宙論 (上) (JUGEMレビュー »)
サイモン・シン, 青木 薫
RECENT COMMENT
  • 確率密度関数f(x)=2xに従う確率変数の和と平均の確率密度関数の導出
    優乃 (04/08)
  • 確率密度関数f(x)=2xに従う確率変数の和と平均の確率密度関数の導出
    アトム (04/08)
  • パスワード自動生成 (Automated Password Generator)
    優乃 (03/20)
  • パスワード自動生成 (Automated Password Generator)
    @KMM_CZ (03/20)
  • 確率密度関数f(x)=2xに従う確率変数の和と平均の確率密度関数の導出
    優乃 (03/12)
  • 確率密度関数f(x)=2xに従う確率変数の和と平均の確率密度関数の導出
    優乃 (03/12)
  • 確率密度関数f(x)=2xに従う確率変数の和と平均の確率密度関数の導出
    アトム (03/12)
  • 豊臣秀吉と曾呂利新左衛門から学ぶ数列の和
    自然数の日 (03/11)
  • 元利均等返済の計算式の導出
    優乃 (06/04)
  • 元利均等返済の計算式の導出
    yasu (06/04)
RECENT TRACKBACK
MOBILE
qrcode
PROFILE
無料ブログ作成サービス JUGEM
 
【JavaScript】多重に派生されたクラスのコンストラクタで,基底クラスのコンストラクタを呼び出す方法
/**
 * 継承関数.
 * @param subClass 派生クラス
 * @param superClass 基底クラス
 */

function inherit(subClass, superClass) {
    var Temp = new Function();
    Temp.prototype = superClass.prototype;
    subClass.prototype = new Temp;
}



function SuperClass() {
    alert("SuperClass Constructor");

    this.q = "superclass";
}

function SubClass() {
    alert("SubClass Constructor");
    this.constructor(); // SuperClassのコンストラクタを呼び出す.

    this.r = "subclass";
}

// 継承
inherit(SubClass, SuperClass);

var a = new SubClass();
alert(a.q);
alert(a.r);
この状態でnew SubClass()とすると,SubClassのコンストラクタが呼び出され,次いでSuperClassのコンストラクタが呼び出される.

上記のような例では問題ない.問題は下記のように二重に派生させた場合だ.
/**
 * 継承関数.
 * @param subClass 派生クラス
 * @param superClass 基底クラス
 */

function inherit(subClass, superClass) {
    var Temp = new Function();
    Temp.prototype = superClass.prototype;
    subClass.prototype = new Temp;
}



function SuperSuperClass() {
    alert("SuperSuperClass Constructor");

    this.p = "supersuperclass";
}


function SuperClass() {
    alert("SuperClass Constructor");
    this.constructor(); // SuperSuperClassのコンストラクタを呼び出す.

    this.q = "superclass";
}

function SubClass() {
    alert("SubClass Constructor");
    this.constructor(); // SuperClassのコンストラクタを呼び出す.

    this.r = "subclass";
}

// 継承
inherit(SuperClass, SuperSuperClass);
inherit(SubClass, SuperClass);

var a = new SubClass();
alert(a.p);
alert(a.q); // undefined
alert(a.r);
この状態でnew SubClass()とすると,SubClassのコンストラクタが呼び出され,次いでSuperSuperClassのコンストラクタが呼び出され,終了する.なんとSuperClassのコンストラクタは呼び出されない.これはまずい.

色々と試行錯誤した結果,次に示すコードに変更し,このSuperClassのコンストラクタが呼び出されない問題を解決した.
/**
 * 継承関数.
 * @param subClass 派生クラス
 * @param superClass 基底クラス
 */

function inherit(subClass, superClass) {
    var Temp = new Function();
    Temp.prototype = superClass.prototype;
    subClass.prototype = new Temp;
    subClass.prototype.__super__ = superClass;
    subClass.prototype.constructor = subClass;
}



function SuperSuperClass() {
    alert("SuperSuperClass Constructor");

    this.p = "supersuperclass";
}

function SuperClass() {
    alert("SuperClass Constructor");
    SuperClass.prototype.__super__(); // SuperSuperClassのコンストラクタを呼び出す.

    this.q = "superclass";
}

function SubClass() {
    alert("SubClass Constructor");
    SubClass.prototype.__super__(); // SuperClassのコンストラクタを呼び出す.

    this.r = "subclass";
}

// 継承
inherit(SuperClass, SuperSuperClass);
inherit(SubClass, SuperClass);

var a = new SubClass();
alert(a.p);
alert(a.q);
alert(a.r);
どうしてこれがOKで,(試行錯誤したうちの)他がNGなのかは分からない.

基底クラスコンストラクタ呼び出し部分の
  SubClass.prototype.__super__();
の記述はスマートとは思えず,可能なら,
  this.__super__();
もしくは以前通り
  this.constructor();
などと書きたいところ.

一行で記述でき,かつクラス名に非依存な書き方を望む.その際,inherit関数が多少複雑になっても構わない.
どなたかご存知の方がいたら教えて頂きたい.→ 教えて頂きました
コメント
コメントする









 
トラックバック
この記事のトラックバックURL
トラックバック機能は終了しました。
「【JavaScript】多重に派生されたクラスのコンストラクタで,基底クラスのコンストラクタを呼び出す方法」(Graviness Blog) にて基底クラスのコンストラクタを呼び出すという話題が出てい
Days on the Moon | 2005/12/05 12:12 AM
【JavaScript】多重に派生されたクラスのコンストラクタで,基底クラスのコンストラクタを呼び出す方法。 なぜ2番目のコードでダメかというと、prototypeを書き換えれば、当然constructorもprot
JavaScriptっぽい。 | 2005/12/08 10:18 PM
基底クラスのコンストラクタを呼び出す話に関連して。「Graviness Blog」と「JavaScriptっぽい。」で示された解決策には少し問題がある。inherit(SubClass, SuperClass) としたとき、SuperClass 内での t
Days on the Moon | 2005/12/09 1:42 PM
 

(C) 2020 ブログ JUGEM Some Rights Reserved.