我想使用显式原型模式来扩展一个“类”。以动物和鱼为例。
我想要做到以下几点:
- 让鱼继承自动物的原型
- 在需要的情况下覆盖动物的成员
- 向鱼的原型添加新成员
- 在仍然使用两个“类”的显式原型模式的情况下实现以上所有操作
我可以创建Animal“类”:
var Animal = function(data) {
this.name = ""
this.color = "";
this.weight = 0;
};
Animal.prototype = function() {
var eat = function() {
document.write(this.name + " is eating.<br>");
}
return {
constructor: Animal,
eat: eat
};
}();
我可以创建一个继承自Animal的Fish“类”:
var Fish = function(data) {
this.isSwimming = false;
};
Fish.prototype = new Animal();
鱼的原型是我遇到麻烦的地方。使用揭示原型模式是否可以对Fish进行操作,并仍然从Animal继承原型并在需要时覆盖Animal?(我不完全反对使用第三方库来完成此操作,但我宁愿不这样做。)例如,如何覆盖eat()并向Fish添加一个名为swim的新函数?
编辑:以下是我想出的解决方法。这似乎可以满足我的需求。我有什么遗漏吗?
Fish.prototype = new function(proto) {
var base = proto.constructor;
var eat = function(data) {
new base().eat (data);//This is just to show you can call the base. If needed.
document.write("fish eating.<br>");
};
var swim = function(){
document.write("fish is swimming.<br>");
};
var thisProto = {
constructor: Fish,
eat: eat,
swim: swim
};
for (var propt in thisProto) {
proto[propt] = thisProto[propt];
}
return proto;
}(new Animal());
编辑:
在我接受的答案中,其中一个主要观点是不使用new关键字。因此,我研究了new关键字和Object.create()之间的区别。如果我理解正确,它们两者基本上做的事情是一样的,但Object.create()不会调用对象的构造函数,而new关键字会。如果你需要继承在构造函数中定义的某个东西,你需要使用new关键字或将该成员移动到原型中。
这是一个我用来进一步实验的Plunk: http://plnkr.co/edit/322WB4jyCJberABbb0P0