javascript - 我应该在 javascript 中使用多态性吗?

标签 javascript inheritance polymorphism

我是一名程序员,曾使用多种语言进行编程,包括函数式语言和面向 OO 的语言。我也编写了一些 Javascript,但从未在其中使用(或不得不使用)多态性。

现在,作为一个爱好项目,我想将一些用 Java 和 C# 编写的大量使用多态性的应用程序移植到 Javascript。

但乍一看,我读了很多“这是可能的,但是......”

那么有替代品吗?

我想用伪语言在 JS 中编写的示例:

abstract class Shape{ { printSurface() } ;  }

class Rect : Shape() {  printSurface() { print (sideA*sideB}}

class Circle : Shape() {  printSurface() { print { pi*r*r }}

TheApp { myshapes.iterate(shape s) {s.printSurface() } }

这是一个经典的多态案例:遍历基类。

我想实现这种行为。我知道它多态性,但是是否还有我忽略的实现这种行为的其他“模式”,或者我应该研究 Javascript 中的继承可能性吗?

最佳答案

如前所述,JavaScript 是一种基于原型(prototype)继承的动态类型语言,因此您不能真正使用与类型语言相同的方法。您所写内容的 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
}

或者,使用 duck typing:

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,所以或者您回退到 duck typing 或者您必须使用 isPrototypeOf,但仅在最近的浏览器:

if (Shape.isPrototypeOf(obj)) {
    // do something with obj
}

Object.create在未实现 ES5 规范的浏览器中不可用,但您可以轻松使用 polyfill(参见链接)。

关于javascript - 我应该在 javascript 中使用多态性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9850892/

相关文章:

javascript - 使用javascript和html5存储空间搜索大量文本

python - 更改模型以从抽象基类继承而不更改数据库

python - 如何通过继承避免 ModelForms 中的代码重复

c++ - C++中的数据继承

javascript - 存储在变量中的 HTML 中的 jQuery 更改属性

javascript - NodeJS 发送数组的数组

c# - 组合优于继承——避免抽象类

Java - 避免静态函数的 switch 语句

Java高阶多态函数

javascript - JavaScript 中的 window.location.href 和 window.open() 方法