JavaScript接口的实现三种方式(推荐)


Posted in Javascript onJune 14, 2016

Javascript模仿接口可以有三种方式:1.注释法 2.检查属性法 3.鸭式辨形法

1.注释法:此方法属于程序文档范畴,对接口的继承实现完全依靠程序员自觉

/*
interface People{
function createHead();
function createBody();
}
*/
var woman = function(name){ //implements People interface
this.name = name;
}
woman.prototype.showName = function(){
alert(this.name);
}
woman.prototype.createBody = function(){ //实现必要的方法
alert("身体已经创建好");
}
woman.prototype.createHead = function(){
alert("头部已经创建好");
}

//2.属性检查法:把要实现的接口方法添加到类属性列表里,通过定义好的检测反复检查是否已经实现了那些方法
//优缺点:可以强迫程序员实现接口,没实现就报错。不过虽然声明了自己实现了哪些方法,但实现时很可能有遗漏

/*
interface People{
function createHead();
function createBody();
}
*/
var woman = function(name){
this.name = name;
this.implementsInterfaces = ['People'];
}
woman.prototype.showName = function(){
alert(this.name);
}
woman.prototype.createBody = function(){ //实现必要的方法
alert("身体已经创建好");
}
woman.prototype.createHead = function(){
alert("头部已经创建好");
}
function implement(obj,interfaces){
for(var i=1;i<interfaces.length;i++){
var interfaceName = interfaces[i];
var interfaceFound = false;
for(var j=0;j<obj.implementsInterfaces.length;j++){
if(obj.implementsInterfaces[j] = interfaceName){
interfaceFound = true;
break;
}
}
if(!interfaceFound){
return false;
}
}
return true;
}
function isImplememts(instance,interfaces){ //判断对象是否已经继承相应接口
if(!implement(instance,interfaces)){
throw new Error("Object doesn't implement a required interface");
}
}

3.鸭式辨型法:(不通过外表判断鸭子,而通过其是否有鸭子的特性来判断。如James Whitcomb Riley所说,像鸭子一样走路并且嘎嘎叫的就是鸭子)

上面俩种都声明了自己实现了那些接口,其实声明不重要,实现接口核心的是类实现了接口方法集。如果类具有了接口定义的所有方法函数名相同的函数,那么认为它实现了接口

//接口类,用来创建接口
var Interface = function(name,motheds){
if(agruments.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;i<motheds.length;i++){
if(typeof motheds[i] !== 'string'){
throw new Error('Interface constructor expects mothed names to be'+'passes in as a string');
}
this.methods.push(motheds[i]);
}
}
Interface.prototype.ensureImplements = function(objs){
if(agruments.length != 1){
throw new Error("Interface constructor called with "+arguments.length+"arguments,but expected exactly 1")
}
for(var i=0;i<objs.length;i++){
var obj = objs[i];
for(var j=0;j<this.motheds.length;j++){
var mothed = this.methods[j];
if(!obj[mothed] || !typeof obj[mothed] !== 'function'){
throw new Error('Function Interface.ensureImplements:implements interface'+this.name+',obj.mothed'+mothed+'was not found');
}
}
}
}
//创建接口
var People = new Interface('People',['createHead','createBody']);
//子类
var Woman = function(name){
this.name = name;
this.implementsInterfaces = ['People'];
}
Woman.prototype.showName = function(){
alert(this.name);
}
Woman.prototype.createBody = function(){ //实现必要的方法
alert("女人身体已经创建好");
}
Woman.prototype.createHead = function(){
alert("女人头部已经创建好");
}
//子类
var Man = function(name){
this.name = name;
this.implementsInterfaces = ['People'];
}
Man.prototype.showName = function(){
alert(this.name);
}
Man.prototype.createBody = function(){ //实现必要的方法
alert("男人身体已经创建好");
}
Man.prototype.createHead = function(){
alert("男人头部已经创建好");
}
//判断是否实现
Poeple.ensureImplements(['Woman','Man']);
Javascript 相关文章推荐
Prototype1.5 rc2版指南最后一篇之Position
Jan 10 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
Mar 18 Javascript
js简单的弹出框有关闭按钮
May 05 Javascript
jQuery选择器querySelector的使用指南
Jan 23 Javascript
jQuery实现只允许输入数字和小数点的方法
Mar 02 Javascript
实用又漂亮的BootstrapValidator表单验证插件
May 30 Javascript
Javascript类型系统之String字符串类型详解
Jun 21 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
Aug 25 Javascript
JavaScript ES6中const、let与var的对比详解
Jun 18 Javascript
vue刷新和tab切换实例
Feb 11 Javascript
vue-cli脚手架的安装教程图解
Sep 02 Javascript
vue实现同时设置多个倒计时
May 20 Vue.js
jQuery处理XML文件的几种方法
Jun 14 #Javascript
你不需要jQuery(三) 新AJAX方法fetch()
Jun 14 #Javascript
深入理解jQuery 事件处理
Jun 14 #Javascript
使用jquery获取url及url参数的简单实例
Jun 14 #Javascript
JS操作JSON方法总结(推荐)
Jun 14 #Javascript
JavaScript Promise 用法
Jun 14 #Javascript
Javascript基础_简单比较undefined和null 值
Jun 14 #Javascript
You might like
php产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
2017/03/13 Javascript
vue.js从安装到搭建过程详解
2017/03/17 Javascript
基于JavaScript实现的折半查找算法示例
2017/04/14 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
jQuery模拟实现天猫购物车动画效果实例代码
2017/05/25 jQuery
Angular2使用jQuery的方法教程
2017/05/28 jQuery
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
babel的使用及安装配置教程
2018/02/22 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
js实现各浏览器全屏代码实例
2018/07/03 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
九步学会Python装饰器
2015/05/09 Python
Python编程中的文件操作攻略
2015/10/16 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
python使用KNN算法手写体识别
2018/02/01 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
2019/06/11 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
Python如何根据时间序列数据作图
2020/05/12 Python
Python接收手机短信的代码整理
2020/08/02 Python
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
若干个Java基础面试题
2015/05/19 面试题
职业技术学校毕业生推荐信
2013/12/03 职场文书
应届行政管理专业个人自我评价
2013/12/28 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
2015年外联部工作总结
2015/04/03 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
MySQL自定义函数及触发器
2022/08/05 MySQL