JavaScript プロトタイプの継承に関するページを読みましたが、検証を伴うコンストラクターの使用に対処するものは見つかりませんでした。このコンストラクターを動作させることはできましたが、理想的ではないことはわかっています。つまり、プロトタイプの継承を利用していません。
function Card(value) {
if (!isNumber(value)) {
value = Math.floor(Math.random() * 14) + 2;
}
this.value = value;
}
var card1 = new Card();
var card2 = new Card();
var card3 = new Card();
これにより、ランダムな値を持つ 3 つの Card オブジェクトが生成されます。ただし、私が理解している方法は、この方法で新しい Card オブジェクトを作成するたびに、コンストラクター コードをコピーしていることです。代わりにプロトタイプの継承を使用する必要がありますが、これは機能しません。
function Card(value) {
this.value = value;
}
Object.defineProperty( Card, "value", {
set: function (value) {
if (!isNumber(value)) {
value = Math.floor(Math.random() * 14) + 2;
}
this.value = value;
}
});
これも機能しません:
Card.prototype.setValue = function (value) {
if (!isNumber(value)) {
value = Math.floor(Math.random() * 14) + 2;
}
this.value = value;
};
一つには、私はもう呼び出すことができませんnew Card()
。var card1 = new Card(); card1.setValue();
これは非常に非効率的で醜いように思えます。しかし、実際の問題は、各 Card オブジェクトの value プロパティを同じ値に設定することです。ヘルプ!
編集
Bergi の提案に従って、コードを次のように変更しました。
function Card(value) {
this.setValue(value);
}
Card.prototype.setValue = function (value) {
if (!isNumber(value)) {
value = Math.floor(Math.random() * 14) + 2;
}
this.value = value;
};
var card1 = new Card();
var card2 = new Card();
var card3 = new Card();
これにより、ランダムな値を持つ 3 つの Card オブジェクトが生成されます。これはすばらしいことです。後で setValue メソッドを呼び出すことができます。ただし、クラスを拡張しようとすると転送されないようです:
function SpecialCard(suit, value) {
Card.call(this, value);
this.suit = suit;
}
var specialCard1 = new SpecialCard("Club");
var specialCard2 = new SpecialCard("Diamond");
var specialCard3 = new SpecialCard("Spade");
エラーが発生しましthis.setValue is not a function
た。
編集 2
これはうまくいくようです:
function SpecialCard(suit, value) {
Card.call(this, value);
this.suit = suit;
}
SpecialCard.prototype = Object.create(Card.prototype);
SpecialCard.prototype.constructor = SpecialCard;
これは良い方法ですか?
最終編集!
Bergi と Norguard のおかげで、最終的にこの実装にたどり着きました。
function Card(value) {
this.setValue = function (val) {
if (!isNumber(val)) {
val = Math.floor(Math.random() * 14) + 2;
}
this.value = val;
};
this.setValue(value);
}
function SpecialCard(suit, value) {
Card.call(this, value);
this.suit = suit;
}
Bergi は、プロトタイプ チェーンを継承できなかった理由を特定するのを手伝ってくれました。Norguard は、プロトタイプ チェーンをいじらないほうがよい理由を説明してくれました。コードがより簡潔で理解しやすいため、このアプローチが気に入っています。