我讀過關於JavaScript原型繼承的頁面和頁面,但是我沒有發現任何使用涉及驗證的構造函數的地址。我已經成功地得到這個構造工作,但我知道這是不理想的,即它不採取原型繼承的優勢:對構造函數的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();
這導致使用隨機值三個對象。然而,我理解它的方式是,每次我以這種方式創建一個新的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();
這導致使用隨機值,這是偉大的三個對象,我可以打電話稍後的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;
這是一個好辦法做到這一點?
Final Edit!
感謝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解釋爲什麼最好不要與淤泥原型鏈。我喜歡這種方法,因爲代碼更清晰,更易於理解。
據我所知,原來的代碼是完全沒問題的。 – Inkbug 2012-07-26 05:01:47