javascript 实现 接口编程
- // Constructor.
- var Interface = function (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 (var i = 0, len = methods.length; i < len; i++) {
- if (typeof methods[i] !== 'string') {
- throw new Error("Interface constructor expects method names to be " + "passed in as a string.");
- }
- this.methods.push(methods[i]);
- }
- };
- // Static class method.
- Interface.ensureImplements = function (object) {
- if (arguments.length < 2) {
- throw new Error("Function Interface.ensureImplements called with " + arguments.length + "arguments, but expected at least 2.");
- }
- for (var i = 1, len = arguments.length; i < len; i++) {
- var interface = arguments[i];
- if (interface.constructor !== Interface) {
- throw new Error("Function Interface.ensureImplements expects arguments" + "two and above to be instances of Interface.");
- }
- for (var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) {
- var method = interface.methods[j];
- if (!object[method] || typeof object[method] !== 'function') {
- throw new Error("Function Interface.ensureImplements: object " + "does not implement the " + interface.name + " interface. Method " + method + " was not found.");
- }
- }
- }
- };
- //定义了一个USB接口
- var USB = new Interface('USB', ['read', 'write']);
- //FlashDisk类,需要实现USB接口
- function FlashDisk() {
- }
- FlashDisk.prototype.read = function () {
- };
- FlashDisk.prototype.write = function () {
- };
- //MP3类,同样需要实现USB接口
- function MP3() {
- }
- MP3.prototype.read = function () {
- };
- MP3.prototype.write = function () {
- };
- //没有实现USB接口或没有全部实现
- function BadDevice() {
- }
- BadDevice.prototype.write = function () {
- };
- //没有实现该接口
- /*BadDevice.prototype.read = function () {
- }*/
- //USB设备管理类
- function USBManager() {
- this.devices = [];
- }
- USBManager.prototype.add = function (device) {
- Interface.ensureImplements(device, USB); //确保添加的设备实现了USB接口,没有实现的话会抛出异常
- this.devices.push(device);
- };
- var disk = new FlashDisk();
- var mp3 = new MP3();
- var bad = new BadDevice();
- var manager = new USBManager();
- manager.add(disk);
- manager.add(mp3);
- manager.add(bad); //此处会抛出异常
接口是基于实例方法的,如果未实现,静态方法就会抛出错误。
javascript 实现 接口编程的更多相关文章
- javascript设计模式学习之十七——程序设计原则与面向接口编程
一.编程设计原则 1)单一职责原则(SRP): 这里的职责是指“引起变化的原因”:单一职责原则体现为:一个对象(方法)只做一件事. 事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原 ...
- JavaScript的面向对象编程(OOP)(一)——类
在学习JavaScript面向对象的编程之前,需要知道,并了解面向对象的一些基本的常识.初学者中大多数都以为面向对象中,面向对象的编程是很重要和占据很大一部分精力.笔者在之前也是认为OOP是面向对象的 ...
- 翻译连载 | 第 9 章:递归(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- 翻译连载 | 第 11 章:融会贯通 -《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- 翻译连载 | 附录 B: 谦虚的 Monad-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- 全本 | iKcamp翻译 | 《JavaScript 轻量级函数式编程》|《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson - <You-Dont-Know-JS>作者 译者团队(排名不分先后):阿希.blueken.bruc ...
- javascript的异步编程
同步与异步 介绍异步之前,回顾一下,所谓同步编程,就是计算机一行一行按顺序依次执行代码,当前代码任务耗时执行会阻塞后续代码的执行. 同步编程,即是一种典型的请求-响应模型,当请求调用一个函数或方法后, ...
- 多媒体(1):MCI接口编程
目录 多媒体(1):MCI接口编程 多媒体(2):WAVE文件格式分析 多媒体(3):基于WindowsAPI的视频捕捉卡操作 多媒体(4):JPEG图像压缩编码 多媒体(1):MCI接口编程
- Hibernate(八)__级联操作、struts+hibernate+接口编程架构
级联操作 所谓级联操作就是说,当你进行主对象某个操作时,从对象hibernate自动完成相应操作. 比如: Department <---->Student 对象关系,我希望当我删除一个d ...
随机推荐
- Java - 通过私有构造方法获取实例
- 2D和3D效果
<style type="text/css"> #div1{ width: 200px; height: 200px; background-color:#aaa; c ...
- Base64及其Python实现
1. 什么是Base64 Base64是一种基于64个可打印字符来表示二进制数据的表示方法 Base64是一种编码方式,提及编码方式,必然有其对应的字符集合.在Base64编码中,相互映射的两个集合是 ...
- V4L2学习(二)结构介绍
v4l2_device v4l2_device在v4l2框架中充当所有v4l2_subdev的父设备,管理着注册在其下的子设备.以下是v4l2_device结构体原型(去掉了无关的成员): struc ...
- opencv中的仿射变换
什么是仿射变换? 原理:1.一个任意的仿射变换都能表示为 乘以一个矩阵(线性变换) 接着再 加上一个向量(平移) 2.综上所述,我们能够用仿射变换来表示: 1)旋转(线性变换) 2)平移(向量加) 3 ...
- windows控制台主题美化工具-colortool
最近在win10上装了 wsl 系统,发现界面主题太挫,文件夹颜色很不清晰 . 特此在网上搜索了一下,发现了 colortool 这个工具 这是微软官方提供的用于控制台配色的程序 发布版本地址:htt ...
- Appium的三种等待时间设置方法
#三种appium设置等待时间的方法 #作者:Mr.Dantes #参考了网上的资料,然后进行了梳理 #第一种 sleep(): 设置固定休眠时间. python 的 time 包提供了休眠方法 ...
- linux常用命令与系统管理常用命令
linux命令:切换用户:开启ftp服务:service vsftpd start 开启ssh服务:service sshd start普通用户切换到超级用户:su rootlogout:(注销)un ...
- Python+Selenium练习篇之13-获取当前页面的URL
本文介绍如何通过webdriver方法获取当前测试页面的URL.获取当前URL有什么用处呢,一般URL可以帮助我们判断跳转的页面是否正确,或者URL中部分字段可以作为我们自动化测试脚本期待结果的一部分 ...
- Windows下MySQL8.0.11.0安装教程
1.mysql下载地址:https://dev.mysql.com/downloads/installer/ 2.下载安装MySQL 8.0.11.0 https://cdn.mysql.com//D ...