正如所说,JavaScript是一种基于原型继承的动态类型语言,因此您无法真正使用与静态类型语言相同的方法。您所编写的代码的JS版本可能如下所示:
function Shape(){
throw new Error("Abstract class")
}
Shape.prototype.printSurface = function () {
throw new Error ("Not implemented");
}
function Rect() {
// constructor;
}
Rect.prototype = Object.create(Shape.prototype);
Rect.prototype.printSurface = function() {
// Rect implementation
}
function Circle() {
// constructor;
}
Circle.prototype = Object.create(Shape.prototype);
Circle.prototype.printSurface = function() {
// Circle implementation
}
接着,在您的应用程序中:
var obj = new Circle();
if (obj instanceof Shape) {
// do something with a shape object
}
或者,使用鸭子类型:
if ("printSurface" in obj)
obj.printSurface();
// or
if (obj.printSurface)
obj.printSurface();
// or a more specific check
if (typeof obj.printSurface === "function")
obj.printSurface();
你也可以将Shape
作为一个没有任何构造函数的对象,这更像是一个"抽象类":
var Shape = {
printSurface : function () {
throw new Error ("Not implemented");
}
}
function Rect() {
// constructor;
}
Rect.prototype = Object.create(Shape);
Rect.prototype.printSurface = function() {
// Rect implementation
}
function Circle() {
// constructor;
}
Circle.prototype = Object.create(Shape);
Circle.prototype.printSurface = function() {
// Circle implementation
}
请注意,在这种情况下,您不能再使用instanceof
,因此您必须退回到“鸭子类型”或使用isPrototypeOf
,但它仅在最近的浏览器中可用:
if (Shape.isPrototypeOf(obj)) {
// do something with obj
}
Object.create在不支持ES5规范的浏览器中不可用,但是你可以轻松地使用一个polyfill(请参见链接)。
[LenientThis]
错误。 - m93a