2

JS で単純な Price クラスを作成したいとします。基本的には数値なので、数値から継承するだけだと思いました。ここにいくつかのコードがあります:

Number.prototype.toMoney = function (precision, decimals, thousands) {
    // Formats number...
}

function Price(val) {
    Number.call(val); // Based on MozillaDN
}

Price.sufix = ' EUR'; // To print with every Price

// Price.prototype = Number.prototype;
Price.prototype = new Number(); // any difference?

Price.prototype.toString = function() {
    return this.toMoney() + Price.sufix; // Of course it does not work.
}

var price = new Price(100.50);
alert(price.toString()); // Gives: undefined EUR
alert(price); // This fail. I thought it should work as it works with Numbers.

私はおそらく何か間違ったことをしていますが、何がわかりません。

4

3 に答える 3

0

あなたのコンストラクターはあなたが考えていることをしていません:

function Price(val) {
    Number.call(val); // Based on MozillaDN
}

コンストラクターとして呼び出されると、上記は、 の値に関係なく、プリミティブ値 +0 が返す値ではなく、プレーン オブジェクト (関数のthisオブジェクト) を返します。したがって、それを返そうとしても、他の何かを返そうとしても、コンストラクターは常にオブジェクトを返すため、コンストラクターはそのthisを返します。Number.call(val)val

Number が関数として呼び出された場合、型変換が行われます。値が渡されないため (値が指定されずにthisvalオブジェクトとして の値が渡される)、式は +0 を返します。

とにかく、そのポイントは何ですか?の値を持つ Number オブジェクトを作成しようとしていますvalか? Price.prototypeに、適切な値を返すカスタムのtoStringおよびvalueOfメソッドを提供することをお勧めします。Number.prototypeの同じ名前のメソッドを模倣することは理にかなっています。

> // Price.prototype = Number.prototype; 
> Price.prototype = new Number();
> // any difference?

[[Prototype]]はい、2 つ目はPrice インスタンスのチェーンに追加の Number オブジェクトを追加します。これは、Number.prototype に影響を与えることなく、Price.prototype にプロパティとメソッドを追加できることを意味します。

実装例を次に示します。

function Price(value, symbol) {
  this.value = value;
  this.symbol = symbol;
}

Price.prototype = {
  toString: function() {
    return '' + this.symbol + this.valueOf();
  },

  valueOf: function() {
    return this.value.toFixed(2);
  }
}

var x = new Price(10.50, '$');

alert(x + '\n' + (1*x)); // $10.50  10.5
于 2012-06-09T14:31:51.137 に答える
0

この行にタイプミスがあると思います:

Price.prototype - new Number(); // any difference?

Price のプロトタイプとなる新しい Number を割り当てているため、マイナス記号ではなく = 記号を使用する必要があります。

それは読むべきです:

Price.prototype = new Number(); // any difference?

そうは言っても、まだうまくいきません。Number から継承しようとしている理由がわかりません。

これは機能します:

function Price(val) {
    this.val = val;                
}
Price.suffix = ' EUR'; // To print with every Price

Price.prototype = {
    toString: function() {
        return this.toMoney() + Price.suffix;
    },
    toMoney: function(precision, decimals, thousands){
        //fancy code here to format the number
        return "formatted number " + this.val;
    }
};

var price = new Price(100.50);
alert(price.toString()); // returns: formatted number 100.50 EUR
alert(price); 
于 2012-06-09T14:07:27.530 に答える