怎么在js中模拟interface?

js中没有这个东西,可以模拟吗?

阅读 8.8k
2 个回答

可以模拟接口,定义如下接口类:

/**
 * 接口定义类
 * @class Interface
 */
class Interface {
    constructor(name, methods) {
        // 参数合法性校验
        if(arguments.length != 2){
            throw new Error(`Interface constructor called with ${arguments.length} arguments,but expected exactly 2`);
        }

        this.name = name;
        // 接口定义数组合法性校验
        this.methods = [];
        for(let i = 0, len = methods.length; i < len; i++) {
            if(typeof methods[i] !== 'string') {
                throw new Error('Interface constructor expects mothed names to be passed as a string');
            }
            this.methods.push(methods[i]);
        }
    }

    /**
     * 接口合法性校验
     * @method ensureImplements
     * @param {Object} instance
     */
    ensureImplements(instance) {
        // 参数合法性校验
        if(arguments.length != 1){
            throw new Error(`Interface constructor called with ${arguments.length} arguments,but expected exactly 1`);
        }

        /* 校验传入的对象实例是否实现了指定接口 */
        for(let i = 0, len = this.methods.length; i < len; i++) {
            let method = this.methods[i];
            if(!instance[method] || typeof instance[method] !== 'function') {
                throw new Error(`Function Interface.ensureImplements:implements interface ${this.name} obj.mothed ${method} was not found`);
            }
        }
    }
}

根据需求实现该接口类,这里实现了一个简单的测试接口类:
let TestInterface = new Interface('Test', ['test1', 'test2']);
上面的测试接口要求实例必须实现 test1 和 test2 两个方法。

测试接口类可以这么使用:

let TestInstance = {
    test1: () => {}
};
TestInterface.ensureImplements(TestInstance);

因为 TestInstance 没有实现 test2 接口,所以 ensureImplements 会抛出异常,这样就能实现简单的接口验证逻辑了。

我觉得没法模拟,语言本身不会做这种检查,除非你自己写解析器,类似typescript那样在js的基础之上构建新的体系,然是编译为js后这些OO的东西应该就没有了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题