1. // Constructor.
  2. var Interface = function (name, methods) {
  3. if (arguments.length != 2) {
  4. throw new Error("Interface constructor called with " + arguments.length + "arguments, but expected exactly 2.");
  5. }
  6. this.name = name;
  7. this.methods = [];
  8. for (var i = 0, len = methods.length; i < len; i++) {
  9. if (typeof methods[i] !== 'string') {
  10. throw new Error("Interface constructor expects method names to be " + "passed in as a string.");
  11. }
  12. this.methods.push(methods[i]);
  13. }
  14. };
  15.  
  16. // Static class method.
  17. Interface.ensureImplements = function (object) {
  18. if (arguments.length < 2) {
  19. throw new Error("Function Interface.ensureImplements called with " + arguments.length + "arguments, but expected at least 2.");
  20. }
  21. for (var i = 1, len = arguments.length; i < len; i++) {
  22. var interface = arguments[i];
  23. if (interface.constructor !== Interface) {
  24. throw new Error("Function Interface.ensureImplements expects arguments" + "two and above to be instances of Interface.");
  25. }
  26. for (var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) {
  27. var method = interface.methods[j];
  28. if (!object[method] || typeof object[method] !== 'function') {
  29. throw new Error("Function Interface.ensureImplements: object " + "does not implement the " + interface.name + " interface. Method " + method + " was not found.");
  30. }
  31. }
  32. }
  33. };

  

  1. //定义了一个USB接口
  2. var USB = new Interface('USB', ['read', 'write']);
  3.  
  4. //FlashDisk类,需要实现USB接口
  5. function FlashDisk() {
  6. }
  7.  
  8. FlashDisk.prototype.read = function () {
  9. };
  10.  
  11. FlashDisk.prototype.write = function () {
  12. };
  13.  
  14. //MP3类,同样需要实现USB接口
  15. function MP3() {
  16. }
  17.  
  18. MP3.prototype.read = function () {
  19. };
  20.  
  21. MP3.prototype.write = function () {
  22. };
  23.  
  24. //没有实现USB接口或没有全部实现
  25. function BadDevice() {
  26. }
  27.  
  28. BadDevice.prototype.write = function () {
  29. };
  30.  
  31. //没有实现该接口
  32. /*BadDevice.prototype.read = function () {
  33. }*/
  34.  
  35. //USB设备管理类
  36. function USBManager() {
  37. this.devices = [];
  38. }
  39.  
  40. USBManager.prototype.add = function (device) {
  41. Interface.ensureImplements(device, USB); //确保添加的设备实现了USB接口,没有实现的话会抛出异常
  42.  
  43. this.devices.push(device);
  44. };
  45.  
  46. var disk = new FlashDisk();
  47. var mp3 = new MP3();
  48. var bad = new BadDevice();
  49.  
  50. var manager = new USBManager();
  51.  
  52. manager.add(disk);
  53. manager.add(mp3);
  54.  
  55. manager.add(bad); //此处会抛出异常

接口是基于实例方法的,如果未实现,静态方法就会抛出错误。

javascript 实现 接口编程的更多相关文章

  1. javascript设计模式学习之十七——程序设计原则与面向接口编程

    一.编程设计原则 1)单一职责原则(SRP): 这里的职责是指“引起变化的原因”:单一职责原则体现为:一个对象(方法)只做一件事. 事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原 ...

  2. JavaScript的面向对象编程(OOP)(一)——类

    在学习JavaScript面向对象的编程之前,需要知道,并了解面向对象的一些基本的常识.初学者中大多数都以为面向对象中,面向对象的编程是很重要和占据很大一部分精力.笔者在之前也是认为OOP是面向对象的 ...

  3. 翻译连载 | 第 9 章:递归(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  4. 翻译连载 | 第 11 章:融会贯通 -《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  5. 翻译连载 | 附录 B: 谦虚的 Monad-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  6. 全本 | iKcamp翻译 | 《JavaScript 轻量级函数式编程》|《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson - <You-Dont-Know-JS>作者 译者团队(排名不分先后):阿希.blueken.bruc ...

  7. javascript的异步编程

    同步与异步 介绍异步之前,回顾一下,所谓同步编程,就是计算机一行一行按顺序依次执行代码,当前代码任务耗时执行会阻塞后续代码的执行. 同步编程,即是一种典型的请求-响应模型,当请求调用一个函数或方法后, ...

  8. 多媒体(1):MCI接口编程

    目录 多媒体(1):MCI接口编程 多媒体(2):WAVE文件格式分析 多媒体(3):基于WindowsAPI的视频捕捉卡操作 多媒体(4):JPEG图像压缩编码 多媒体(1):MCI接口编程

  9. Hibernate(八)__级联操作、struts+hibernate+接口编程架构

    级联操作 所谓级联操作就是说,当你进行主对象某个操作时,从对象hibernate自动完成相应操作. 比如: Department <---->Student 对象关系,我希望当我删除一个d ...

随机推荐

  1. Java - 通过私有构造方法获取实例

  2. 2D和3D效果

    <style type="text/css"> #div1{ width: 200px; height: 200px; background-color:#aaa; c ...

  3. Base64及其Python实现

    1. 什么是Base64 Base64是一种基于64个可打印字符来表示二进制数据的表示方法 Base64是一种编码方式,提及编码方式,必然有其对应的字符集合.在Base64编码中,相互映射的两个集合是 ...

  4. V4L2学习(二)结构介绍

    v4l2_device v4l2_device在v4l2框架中充当所有v4l2_subdev的父设备,管理着注册在其下的子设备.以下是v4l2_device结构体原型(去掉了无关的成员): struc ...

  5. opencv中的仿射变换

    什么是仿射变换? 原理:1.一个任意的仿射变换都能表示为 乘以一个矩阵(线性变换) 接着再 加上一个向量(平移) 2.综上所述,我们能够用仿射变换来表示: 1)旋转(线性变换) 2)平移(向量加) 3 ...

  6. windows控制台主题美化工具-colortool

    最近在win10上装了 wsl 系统,发现界面主题太挫,文件夹颜色很不清晰 . 特此在网上搜索了一下,发现了 colortool 这个工具 这是微软官方提供的用于控制台配色的程序 发布版本地址:htt ...

  7. Appium的三种等待时间设置方法

    #三种appium设置等待时间的方法 #作者:Mr.Dantes  #参考了网上的资料,然后进行了梳理   #第一种 sleep(): 设置固定休眠时间. python 的 time 包提供了休眠方法 ...

  8. linux常用命令与系统管理常用命令

    linux命令:切换用户:开启ftp服务:service vsftpd start 开启ssh服务:service sshd start普通用户切换到超级用户:su rootlogout:(注销)un ...

  9. Python+Selenium练习篇之13-获取当前页面的URL

    本文介绍如何通过webdriver方法获取当前测试页面的URL.获取当前URL有什么用处呢,一般URL可以帮助我们判断跳转的页面是否正确,或者URL中部分字段可以作为我们自动化测试脚本期待结果的一部分 ...

  10. Windows下MySQL8.0.11.0安装教程

    1.mysql下载地址:https://dev.mysql.com/downloads/installer/ 2.下载安装MySQL 8.0.11.0 https://cdn.mysql.com//D ...