这是 elclanrs 解决方案的扩展(请原谅双关语),包括实例方法的详细信息,并对问题的这方面采取可扩展的方法;我完全承认,这要归功于 David Flanagan 的“JavaScript:权威指南”(针对此上下文进行了部分调整)。请注意,这显然比其他解决方案更冗长,但从长远来看可能会受益。
首先,我们使用 David 的简单“扩展”函数,它将属性复制到指定对象:
function extend(o,p) {
for (var prop in p) {
o[prop] = p[prop];
}
return o;
}
然后我们实现他的子类定义实用程序:
function defineSubclass(superclass, // Constructor of our superclass
constructor, // Constructor of our new subclass
methods, // Instance methods
statics) { // Class properties
// Set up the prototype object of the subclass
constructor.prototype = Object.create(superclass.prototype);
constructor.prototype.constructor = constructor;
if (methods) extend(constructor.prototype, methods);
if (statics) extend(constructor, statics);
return constructor;
}
在最后的准备工作中,我们使用 David 的新 jiggery-pokery 来增强我们的 Function 原型:
Function.prototype.extend = function(constructor, methods, statics) {
return defineSubclass(this, constructor, methods, statics);
};
在定义了我们的 Monster 类之后,我们执行以下操作(这对于我们想要扩展/继承的任何新类都是可重用的):
var Monkey = Monster.extend(
// constructor
function Monkey() {
this.bananaCount = 5;
Monster.apply(this, arguments); // Superclass()
},
// methods added to prototype
{
eatBanana: function () {
this.bananaCount--;
this.health++;
this.growl();
}
}
);