我读过关于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