QA@IT

#javascript 初心者 NaNになる原因について

752 PV

function cal(a,b,c){
this.a=a;
this.b=b;
this.c=c;
this.valueOf=function(){
return a+b+c;
}
this.print=function(){

document.write(this.valueOf()+"");
}
}

var p= new cal(1,2,3);
p.print();//ここまでは正しく機能する

function newcal(){

};
newcal.prototype=new cal();
var p2 = new newcal(1,2,3);
p2.print();
//ここでNaNと表示されてしまう

なぜNaNになってしまうのでしょうか?

回答

レスが付かないようですので、JavaScript はよく知りませんが、一言レスなど・・・

なぜNaNになってしまうのでしょうか?

var p2 = new newcal(1,2,3); では a, b, c の値が渡せてないからでしょう。Visual Studio Community 2015 + IE11 でデバッグすると以下の通りです。

debug.jpg

何故 a, b, c の値が渡せないかは、想像ですが、function newcal() がそういう定義になっていないからだと思います。書き方が自分的には普通じゃないので、それ以上追及する気力がないです。

質問者さんのコードの前者はクロージャーを使用、後者はプロトタイプを使用する場合だと想像していますが、そうであれば、以下のように書いてはいかがでしょう。

// クロージャーを使用
var cal = function (a, b, c) {
    this.a = a;
    this.b = b;
    this.c = c;

    this.valueOf = function () {
        return this.a + this.b + this.c;
    }

    this.print = function () {
        document.write(this.valueOf() + "");
    }
}

var p = new cal(1, 2, 3);
p.print();

// プロトタイプを使用
var newcal = function (a, b, c) {
    this.initialize(a, b, c);
}

newcal.prototype.initialize = function (a, b, c) {
    this.a = a;
    this.b = b;
    this.c = c;
}

newcal.prototype.valueOf = function () {
    return this.a + this.b + this.c;
}

newcal.prototype.print = function () {
    document.write(this.valueOf() + "");
}

var p2 = new newcal(1, 2, 3)
p2.print();
編集 履歴 (0)
  • ありがとうございます。とても分かりやすかったです! -
  • 質問者さんの課題が解決したのであればクローズしてください。まだ質問があればそれを書いてください。だだしタイトル&最初の内容と異なる質問の場合は、新たに別のスレッドを立ててそこで質問していただくようお願いします。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。