- ベストアンサー
クラスメンバ・メソッドの継承に関する質問
- クラスのインスタンスオブジェクトで不変なクラスメンバとメソッドを定義したいが、継承クラスでエラーが発生している。
- JavaScriptではクラス定義内部とprototypeで設定したメンバとメソッドしか継承できないため、問題が発生している。
- 他の継承の方法を探し、ベースクラスで設定したクラスメンバとメソッドを継承したい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
クラス変数・関数はインスタンスではなくクラスに属するものなので「そもそも~」の通りかと。 >クラスのインスタンスオブジェクトで不変なクラスメンバとメソッド~ 厳密には無理だと思います。とりあえず function baseClass(){ var Str = "base class instance property"; return{ getStr:function(){return Str;} }; } などとして、内部の変数として隠蔽しアクセサを用意すればよいと思いますが、関数自体を上書きされればそれまでです。配布ではなく自分だけで使用する分には、 baseClass._clsStr = ~ baseClass._clsMethod = ~ のように「変更すべきでないものは_アンダーバーで命名する」などと規則を自分で決めておけば十分の様に思います。 このあたりが参考になるかも。 http://yabooo.org/archives/53
その他の回答 (1)
- kuzumiHK
- ベストアンサー率72% (132/183)
こんな感じでいかがでしょうか。 function baseClass() { this.instStr = "base class instance property"; } baseClass.prototype = { 'prtMethod':function(){return this.instStr;}, 'clsStr':'base class property', 'clsMethod':function(){return baseClass.prototype.clsStr;} } var base_inst = new baseClass(); alert( "baseClass:\n" + "\tinstStr = " + base_inst.instStr + "\n" + "\tprtMethod = " + base_inst.prtMethod() + "\n" + "\tclsStr = " + baseClass.prototype.clsStr + "\n" + "\tclsMethod = " + baseClass.prototype.clsMethod() + "\n" ); function upperClass() { this.instStr = "upper class instance property"; } upperClass.prototype = baseClass.prototype; var upper_inst = new upperClass(); alert( "upperClass:\n" + "\tinstStr = " + upper_inst.instStr + "\n" + "\tprtMethod = " + upper_inst.prtMethod() + "\n" + "\tclsStr = " + upperClass.prototype.clsStr + "\n" + "\tclsMethod = " + upperClass.prototype.clsMethod() + "\n" );
お礼
コメントありがとうございます。 日頃コーディングしているのが Python なので、prototype ベースのクラス 構築に戸惑っています。 結局、prototype で定義したものしか継承してくれないのですね。 「そういうもの」と思ってコーディングしていきたいと思います。
お礼
コメントありがとうございます。 メンバ変数や変数をオーバーライドされることに関しては問題ありません。 (質問に「不変な」と書いたのが誤解を招いたようです、ごめんなさい) new baseClass() した際にはそのインスタンスにクラスメンバが含まれているはず なのに、なぜ継承してくれないのだろう、と疑問に思った上での質問でした。 ご提示のリンクは大変参考になりました。