我正在用JavaScript构建一个纸牌游戏,以增加我的网络编程排序,我遇到了JavaScript Prototype继承问题。我的设计有一个基本卡类,包含任何卡需要的所有功能和数据。设计本身相对灵活,因此只需通过更改存储的数据,大约25%的卡可以使用基类。我需要做的是创建从Card继承所有内容的新类 - 包括数据 - 但是在不触及基类函数的情况下覆盖可用函数的一小部分。
我一直在尝试使用原型继承来实现这一目标,但这会改变基类,它不仅会使用Card类,而且还会从基类继承所有其他函数。
我需要的是一种设计模式,它允许我仅对从Card继承的类重写函数。这在JavaScript中是否可行?
编辑...
对不起,这是一个例子,我们应该首先添加这个。
从Base Card类开始。
function Card(){
this.cardID = 0;
this.name = '';
this.imageID = 0;
this.imageURL = '';
this.imageAlt = '';
etc....
}
Card.prototype.init = function( inID
, inName
, inImageID
, inImageURL
, inImageAlt
, inImageHorizontal
etc...
){
this.cardID = inID;
this.name = inName;
this.imageID = inImageID;
this.imageURL = inImageURL;
this.imageAlt = inImageAlt;
}
Card.prototype.whenPlayed = function(){
return false;
}
现在我的孩子班:
ChildCard.prototype = new Card();
ChildCard.constructor = ChildCard;
function ChildCard(){};
ChildCard.prototype.whenPlayed = function(){
alert("You Win!");
return true;
}
现在看来,如果我要创建一个Card对象并调用它的whenPlayed,我会从ChildCard获取行为而不是Card。
我真正面临的问题是卡片类已接近3种方法,我不想在每个子类中定义每一种方法。
答案 0 :(得分:7)
一种非常简单明了的模式:
function Parent(arg) {
this.someProperty = arg;
// initialize all instance properties in the constructor
}
// The prototype should only contain methods and primitive values.
Parent.prototype.someMethod = function() {
// ...
};
Parent.prototype.someOtherMethod = function() {
// ...
};
function Child(arg1, arg2) {
// call parent constructor -- like super() in other languages
Parent.call(this, arg1);
// initialize all instance properties in the constructor
}
// Hook up Base.prototype into the prototype chain
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child; // not necessary but can be useful
Child.prototype.someMethod = function() {
// override method and call parent method
Base.prototype.someMethod.call(this);
// ...
};
它依赖于Object.create
[MDN]。它创建一个从传入的对象继承的新对象。因此,您在Child.prototype
和Parent.prototype
之间获得了一个间接级别,即对Child.prototype
的更改不会影响`Parent.prototype
。