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 相关文章推荐
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
Mar 10 Javascript
js操作ajax返回的json的注意问题!
Feb 23 Javascript
读jQuery之九 一些瑕疵说明
Jun 21 Javascript
javascript权威指南 学习笔记之null和undefined
Sep 25 Javascript
javascript作用域容易记错的两个地方分析
Jun 22 Javascript
javascript中数组的冒泡排序使用示例
Dec 18 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
Mar 06 Javascript
不定义JQuery插件 不要说会JQuery
Mar 07 Javascript
Web前端开发工具——bower依赖包管理工具
Mar 29 Javascript
使用selenium抓取淘宝的商品信息实例
Feb 06 Javascript
了解前端理论:rscss和rsjs
May 23 Javascript
iSlider手机端图片滑动切换插件使用详解
Dec 24 Javascript
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
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
JavaScript实现的背景自动变色代码
2015/10/17 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
轻松掌握JavaScript状态模式
2016/09/07 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
Python中的CURL PycURL使用例子
2014/06/01 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
Python文件夹与文件的相关操作(推荐)
2016/07/25 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
2017/03/12 Python
python实现二分查找算法
2017/09/21 Python
详解Python发送email的三种方式
2018/10/18 Python
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
Python实现的多进程拷贝文件并显示百分比功能示例
2019/04/09 Python
python pytest进阶之fixture详解
2019/06/27 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
Python使用requests模块爬取百度翻译
2020/08/25 Python
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
Cocopanda波兰:购买化妆品、护肤品、护发和香水
2020/05/25 全球购物
英文版网络工程师求职信
2013/10/28 职场文书
煤矿机修工岗位职责
2014/02/07 职场文书
励志演讲稿200字
2014/08/21 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript