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 相关文章推荐
Prototype Date对象 学习
Jul 12 Javascript
基于jQuery的消息提示插件 DivAlert之旅(二)
Apr 01 Javascript
jquery URL参数判断,确定菜单样式
May 31 Javascript
jquery获取多个checkbox的值异步提交给php
Jul 07 Javascript
JavaScript截断字符串的方法
Jul 15 Javascript
常用的JQuery函数及功能小结
Mar 24 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
Jun 13 Javascript
jquery事件绑定解绑机制源码解析
Sep 19 Javascript
jQuery.Validate表单验证插件的使用示例详解
Jan 04 Javascript
jQuery实现菜单栏导航效果
Aug 15 jQuery
基于JavaScript实现表格隔行换色
May 08 Javascript
JavaScript实现复选框全选和取消全选
Nov 20 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
星际争霸任务指南——神族
2020/03/04 星际争霸
php curl_init函数用法
2014/01/31 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
实例讲解php数据访问
2016/05/09 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
JavaScript Date对象使用总结
2009/05/14 Javascript
style、 currentStyle、 runtimeStyle区别分析
2010/08/01 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
2016/12/08 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
vue的diff算法知识点总结
2018/03/29 Javascript
详解js中Array的方法及技巧
2018/09/12 Javascript
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
python之文件读取一行一行的方法
2018/07/12 Python
PyQt5实现类似别踩白块游戏
2019/01/24 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
美国排名第一的葡萄酒俱乐部:Firstleaf Wine Club
2020/01/02 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
放假通知格式
2015/04/14 职场文书
交通处罚决定书
2015/06/24 职场文书
宣传稿格式范文
2015/07/23 职场文书
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL