Javascript中的写不了接口怎么办?

最近需要使用js的接口能力。

但发现Javascript ES6语法只有继承(extends),但没有接口(interface)的语法。

没有接口的话只能继承,但继承又只能单继承。

那需要多继承才能实现功能就无法推进了。

  • 绘制系统(paint system)
  • 碰撞系统(collision_system)
  • 可绘制物(paintable)
  • 碰撞物(collidable)
  • 蛇(snake)

其中,绘制系统有绘制paintable的能力,而碰撞系统有碰撞检测的能力(检测碰撞物)

在以上的逻辑体系下,蛇只要实现了paintable和collidable,就可以实现绘制和碰撞功能。

但目前Javascript没有提供接口与多继承能力,所以找了找资料,最后选用了以下方法:

使用Javascript的prototype+class定义,实现接口能力。

这里需要两个前置知识,不了解的可以看一下,了解的话跳过就好。

  • Javascript中的class
  • Javascript中的prototype
图片

前置知识:Javascript中的class

图片

Javascript支持class语法。

形如:

/** * 类定义:Demo */class Demo {    /**     * 属性定义:x,y     */    x;    y;
    /**     * 构造方法(构造器):无参构造     */    constructor() {    }
    /**     * 方法定义:doSomething     */    doSomething() {    }}
图片

前置知识:Javascript中的prototype有什么用处?怎么用?

图片

Javascript的prototype可以用来自定义类的行为。

例:为String添加isDate的实例方法:

// 自定义String类的isDate实例方法String.prototype.isDate = function(){    var regex = new RegExp("^[d]([-|/])[d]{1,2}([-|/])[d]{1,2}$");    console.log(this);    return regex.exec(this);}
// 所有string的实例都可以使用之前定义的isDate方法var strValue = "12512412";alert(strValue.isDate());

Javascript接口方案

使用Javascript的prototype+class定义实现接口的能力

  1. 使用class做接口定义
  2. 给出接口定义的使用示例
  3. 按照示例使用接口
1)使用class做接口定义
  • /** * 可碰撞物 */ class Collidable { /** * 描述物体碰撞边界的碰撞矩形 * * 碰撞矩形互相接触时,则会触发碰撞判定(触发Collidable#collision_handle方法)。 */ collision_rects_border() { } /** * 碰撞处理方法 * * 用户需对碰撞进行处理,此方法即碰撞处理方法,会在发生碰撞时触发。 * * @param collidable 与本物体发生碰撞的物体 */ collision_handle(collidable) { }}
2)给出接口定义的使用示例
  • /** * Collidable实现示例 */class CollidableDemoImpl { x = 10; y = 10; width = 10;}
/** * CollidableDemoImpl实现Collidable接口示例 * * collision_rects_border方法实现 */CollidableDemoImpl.prototype.collision_rects_border = function () {        return {x: this.x, y: this.y, width: this.width, height: this.width};}
/** * CollidableDemoImpl实现Collidable接口示例 * * collision_handle方法实现 * * @param collidable 碰撞物 */CollidableDemoImpl.prototype.collision_handle = function (collidable) {    // 根据碰到的碰撞物的实际类型判定,它的处理逻辑是什么
    // 碰到食物    if (collidable instanceof Food) {        // 伪代码:吃掉食物    }    // 伪代码:碰到墙    else if (1 == 1) {        // 伪代码:this.die();    }}
3)按照示例使用接口

按示例与实际业务逻辑,实现接口即可。

总结

可以使用Javascript的prototype+class定义实现接口的能力。

优点:

  • 基本实现了接口的能力
  • 开发工具能够一定程度上识别到接口方法(因为使用class做定义了)
  • 灵活度强(prototype不定义接口都能加方法)

缺点:

  • 能力不完整(比如IDE的rename操作等),不如原生语法好用
  • 约束力不够(prototype支持随意添加方法,约束力差)
  • 代码挺啰嗦的

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/78364.html

(0)
guozi's avatarguozi
上一篇 2024年5月29日 下午5:29
下一篇 2024年5月29日 下午5:35

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注