Как уже говорилось, 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, но вы можете легко использовать полифилл (см. Ссылку).