QA@IT
«回答へ戻る

回答を投稿

レスが付かないようですので、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();
レスが付かないようですので、JavaScript はよく知りませんが、一言レスなど・・・

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

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

![debug.jpg](https://qa-atmarkit-image.s3.amazonaws.com/uploads/attached_image/image/436/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();
```