• 締切済み

thisで定義したプロパティが継承できない

以下のようなコードがあります。 function inherit(subClass, superClass) { for (var prop in superClass.prototype) { if (typeof(subClass.prototype[prop]) == "undefined") { subClass.prototype[prop] = superClass.prototype[prop]; } } } /* class Personal */ { function personal() { this.sex = "男"; } personal.prototype = { "hello" : "こんにちは", "fName" : "苗字", "lName" : "名前", "age" : "年齢" } } /* class Taku17 */ { function taku17() { this.lName = "taku17"; } taku.prototype = { "fName" : "Secret", "age" : 21, "tall" : "1234cm", "height" : "5678Kg", "getFullName" : function() { return this.fName+" "+this.lName; } }; inherit(taku17, personal); } var source = ""; window.onload = function() { var person1 = new taku17(); source += "person1.hello = "+person1.hello+"<br />"; source += "person1.fName = "+person1.fName+"<br />"; source += "person1.lName = "+person1.lName+"<br />"; source += "person1.age = "+person1.age+"<br />"; source += "person1.sex = "+person1.sex+"<br />"; source += "person1.tall = "+person1.tall+"<br />"; source += "person1.height = "+person1.height+"<br />"; source += "person1.getFullName() = "+person1.getFullName()+"<br /><br />"; document.getElementById("result").innerHTML = source.replace(/undefined/g, "<font color=\"#ff0000\">undefined</font>"); } Javascriptでクラス化と継承を実現するためのコードなのですが、出力される情報のうちsexの情報だけがundefinedになってしまいます。sexプロパティはpersonal関数(コンストラクタのつもり)内にthis.sexとして定義してあり、他のプロパティはprototypeで定義してあります。このsexプロパティも継承するにはどのようにしたら良いのでしょうか?色々試してみましたが、そもそもsexプロパティにアクセスする方法から分かりません。

みんなの回答

  • susie-t
  • ベストアンサー率86% (37/43)
回答No.2

すみません、No1の参考URLはprototype.jsに関するものでした。prototype.jsを使わないのであれば無用です^^;

すると、全ての回答が全文表示されます。
  • susie-t
  • ベストアンサー率86% (37/43)
回答No.1

あまり綺麗ではないですが、以下でどうでしょう。 ---------------------------------------- <html> <head> <script> function inherit(subClass, superClass) { for (var prop in superClass.prototype) { if (typeof(subClass.prototype[prop]) == "undefined") { subClass.prototype[prop] = superClass.prototype[prop]; } } } /* class Personal */ { function personal() { this.initializePersonal(); } personal.prototype = { "initializePersonal" : function(){ this.sex = "男"; }, "hello" : "こんにちは", "fName" : "苗字", "lName" : "名前", "age" : "年齢" } } /* class Taku17 */ { function taku17() { this.initializeTaku17(); } taku17.prototype = { "initializeTaku17" : function(){ this.initializePersonal(); this.lName = "taku17"; }, "fName" : "Secret", "age" : 21, "tall" : "1234cm", "height" : "5678Kg", "getFullName" : function() { return this.fName+" "+this.lName; } }; inherit(taku17, personal); } var source = ""; window.onload = function() { var person1 = new taku17(); source += "person1.hello = "+person1.hello+"<br />"; source += "person1.fName = "+person1.fName+"<br />"; source += "person1.lName = "+person1.lName+"<br />"; source += "person1.age = "+person1.age+"<br />"; source += "person1.sex = "+person1.sex+"<br />"; source += "person1.tall = "+person1.tall+"<br />"; source += "person1.height = "+person1.height+"<br />"; source += "person1.getFullName() = "+person1.getFullName()+"<br /><br />"; document.getElementById("result").innerHTML = source.replace(/undefined/g, "<font color=\"#ff0000\">undefined</font>"); } </script> </head> <body> <div id="result"></div> </body> </html> ----------------------------------------- 各コンストラクタ関数は、自オブジェクトのメソッドに処理を丸投げ。継承するサブクラス側では、同じように丸投げして、そのメソッド内で親関数のメソッドを呼び出しています。この際、メソッドの名前が重複しないように注意してください。 この場合、Javaではsuperを使えばいいのですが、JavaScriptにはその機能はないので・・・。(独自に拡張されている方もいます。参考URLを参照してください。)

参考URL:
http://d.hatena.ne.jp/reinyannyan/20051118/p1
すると、全ての回答が全文表示されます。

関連するQ&A