文档章节

JavaScript设计模式学习之二

iPhone
 iPhone
发布于 2015/04/08 15:09
字数 717
阅读 38
收藏 0
点赞 0
评论 0

JS设计模式之接口实现之二

//在这里我们需要给没有实现接口方法的类(Function)提供错误信息
// 还是刚刚那个接口
/*
interface Composite{
	function add(child);
	function remove(child);
	function getChild(index);
}

interface FormItem{
	function save();
}
*/
//这里用到的方法叫属性检查。在实例化类(Function)时检查是否实现了方法
var CompositeForm=function(id,data){
	//号称自己实现了接口
	this.implementsInterface=['Composite','FormItem'];
	this.id=id;
	this.data=data
}
var findchild=function (_array,child) {
	for(var i=0;i<_array.length;i++){
		if(_array[i]===child)
			return i;
	}
	return null;
}

CompositeForm.prototype.add=function(child){
	this.data.push(child);
	return this.data;
}
CompositeForm.prototype.remove=function(child){
	var index=findchild(this.data,child)
	if(index){
		this.data.splice(index,1);
	}
    return this.data;
}
CompositeForm.prototype.getChild=function(index){
	return this.data[index];
}
CompositeForm.prototype.save=function(){
	console.log("save");
}

function log(obj){
	console.log(obj);
}

//上面的代码跟上interface.js的代码相比只是在定义实现类的开头号称自己实现了Composite和FormItem接口,其他没变,
//有了这个声明之后,在这个类实例化后都可以对该实例进行属性检查,如果检查该实例没有实现相应的异常,例如:
// 实例化:
var form=new CompositeForm(1,[1,'hello','world',{asd:"123"}]);
// 接下来,我们认为它实现了Composite中add方法,这次我们需要把实例当做参数来使用,所以我们可以这样做:
var addForm=function(instance,child){
	//检查_from的implementsInterface属性看它是否实现了接口方法,当然啦,检查方法自己实现
	if(!implements(instance,'Composite','FormItem'))
		throw new Error("Object does not implement a required interface");
	return instance.add(child);
}

//下面是implements方法,方法规定第一个为类实例,后面参数为传入的参数,参数使用arguments
function implements(){
	var instance=arguments[0];
	for(var i=1;i<arguments.length;i++){
		var interfaceName=arguments[i];
		var interfaceFound=false;
		for(var j=0;j<instance.implementsInterface.length;j++){
			if(instance.implementsInterface[j]===interfaceName){
				//如果找到则退出本次循环,
				interfaceFound=true;
				break;
			}
		}
		//在这次循环结束的时候检查interfaceFound值是否为true,如果不为true则说明实例没有实现该接口
		if(!interfaceFound){
			return false;
		}
	}
	return true;
}

//接下来是测试,我们认为Composite实现了add方法且按规定我们定义了调用add的addForm方法
// log(form.implementsInterface)
log(addForm(form,'测试'));

在addForm方法中,检查熟悉方法如果写成

if(!implements(instance,'Composite','FormItem','Haha'))

运行结果:

在实际运行过程中,我们并不需要对实例的没过接口进行检查,只需要检查用到的方法所对应的接口即可,这里只使用了add方法,所以语句可以改写成

if(!implements(instance,'Composite'))

好吧,这里并不能检查到底是漏了那个接口,这是一方面,但另一方面,这种实现方式还是人为书面声明,但具体有没有真的去实现那些方法我们还是不得而知,但相比上一篇的方法,多了一些强制性和人性化的警告

© 著作权归作者所有

共有 人打赏支持
iPhone
粉丝 0
博文 7
码字总数 2946
作品 0
海口
JavaScript设计模式之观察者模式

前言 准备研究一下MVVM的一些东西,由于MVVM运用了观察者模式的思想,因此翻开了《JavaScript设计模式与开发实践》一书,将观察者模式学习了一遍,顺便有对一些常用的设计模式进行一些了解,...

Srtian ⋅ 05/22 ⋅ 0

JavaScript 中常见设计模式-单例模式

     单例模式两个条件   确保只有一个实例   可以全局访问   适用   适用于弹框的实现,全局缓存   实现单例模式      JavaScript 中的单例模式   因为 JavaScript 是无...

webstack前端栈 ⋅ 05/19 ⋅ 0

你需要了解的23种JavaScript设计模式

为什么要学习设计模式? 在许多访谈中,你可能会遇到很多面向对象编程中的接口,抽象类,代理和以及其他与设计模式相关的问题。 一旦了解了设计模式,它会让你轻松应对任何访谈,并可以在你的...

java高级架构牛人 ⋅ 06/02 ⋅ 0

js策略模式《JavaScript设计模式与开发实践》阅读笔记

策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且是它们可以相互替换。 策略模式可以避免代码中的多重判断条件。 策略模式很好的体现了开放-封闭原则,将一个个算法(解决方...

RoyLuo ⋅ 05/19 ⋅ 0

JS单例模式《JavaScript设计模式与开发实践》阅读笔记

此文仅记录本人阅读《JavaScript设计模式与开发实践》这个本时的感受,感谢作者曾探写出这么好的一本书。如有冒犯,如有错误,请联系本人:luogao_lg@sina.com处理。 这一章让我知道了单例模...

RoyLuo ⋅ 05/17 ⋅ 0

JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云 ⋅ 05/18 ⋅ 0

js笔记三十之单例模式和工厂模式

单例模式 对象数据类型的作用: 把描述同一个实物(同一个对象)的属性和方法放在一个内存空间下,起到了分组的作用,这样不同事物之间的属性即使属性名相同, 相互也不会发生冲突 --- 这种分组编写...

uplyw ⋅ 05/26 ⋅ 0

JavaScript 中常见设计模式-代理模式

     代理模式   情景:小明追女生 A   非代理模式:小明 =花=> 女生A   代理模式:小明 =花=> 让女生A的好友B帮忙 =花=> 女生A   代理模式的特点   代理对象和本体对象具有一...

webstack前端栈 ⋅ 06/15 ⋅ 0

ES7 Decorator 装饰者模式

原作者:玄农 装饰模式 设计模式大家都有了解,网上有很多系列教程,比如 JS设计模式等等。 这里只分享 装饰者模式 以及在 如何使用 ES7 的 概念 装饰模式 v.s. 适配器模式 装饰模式和适配器...

_朴灵_ ⋅ 05/14 ⋅ 0

从ES6重新认识JavaScript设计模式(二): 工厂模式

1 什么是工厂模式? 工厂模式是用来创建对象的一种最常用的设计模式。我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。工厂模式根据抽象程度...

Lee_tanghui ⋅ 04/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python爬虫,抓取淘宝商品评论内容

作为一个资深吃货,网购各种零食是很频繁的,但是能否在浩瀚的商品库中找到合适的东西,就只能参考评论了!今天给大家分享用python做个抓取淘宝商品评论的小爬虫! 思路 我们就拿“德州扒鸡”...

python玩家 ⋅ 2分钟前 ⋅ 0

MySQL 内核深度优化

MYSQL数据库适用场景广泛,相较于Oracle、DB2性价比更高,Web网站、日志系统、数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是InnoDB事务...

java高级架构牛人 ⋅ 24分钟前 ⋅ 0

用户登录信息-钉子效果(基于jquery2.0)

本js效果使用jquery2.0,清晰的分解用户登录信息的(钉子效果),该效果直接用在作者网站(www.phpkhbd.com)上。 里面的难点有:定时器,延时。 大致效果如下: 一开始: 鼠标放上去的时候:...

宁哥实战课堂 ⋅ 25分钟前 ⋅ 0

解决yum安装报错Protected multilib versions

使用yum安装报错Protected multilib versions原因是因为多个库不能共存,不过更新的话也并不行,但是可以在安装命令后面加上如下一段命令: --setopt=protected_multilib=false 案例: 比如需...

北岩 ⋅ 37分钟前 ⋅ 0

为什么要学习Typescript???

简单来说 目前的typescript就是未来的javascript 为什么?? 这要从ECMA-262标准的第4版说起 对了 我们说的ES5 其实是ECMAScript3.1这个替代性建议被扶正了而已... 那么 第4版标准是什么? 看看...

hang1989 ⋅ 41分钟前 ⋅ 0

linux安装ipfs

一、下载ipfs # cd /usr/local/ipfs/ # wget https://dist.ipfs.io/go-ipfs/v0.4.15/go-ipfs_v0.4.15_linux-amd64.tar.gz # tar -zxvf go-ipfs_v0.4.15_linux-amd64.tar.gz 二、安装ipfs # ......

八戒八戒八戒 ⋅ 47分钟前 ⋅ 0

jvm程序执行慢诊断手册

生产环境最多的几种事故之一就是程序执行慢,如果是web服务的话,表现就是响应时间长。本文分享,从业多年形成的排查守则。 诊断步骤 系统资源查看 首先是系统资源查看,而且必须是在第一步。...

xpbob ⋅ 47分钟前 ⋅ 0

YII2 advanced 高级版本项目搭建-添加API应用以及多应用

一、YII安裝 安裝yii可以用composer安裝,也可以在yii中文社区下载归档文件安装 composer安装就不介绍了,因为要安装composer,比较麻烦,当然安装了composer是最好的,以后安装yii的插件要用...

botkenni ⋅ 48分钟前 ⋅ 0

在jdk1.8的环境下模拟永久代内存溢出

相信不少小伙伴在看深入理解Java虚拟机的时候,作者给我们举例一个demo来发生PermGen space 1、通过List不断添加String.intern(); 2、通过设置对应的-XX:PermSize与-XX:MaxPermSize(更快看到...

虾几把写 ⋅ 今天 ⋅ 0

开发OpenDaylight组件的完整流程

在前面介绍学习了OpenDaylight的几个重要模块后,这里再来介绍下完整开发一个模块的过程。 OSGI的bundles提供被其他OSGI组件调用的服务。这个教程中展示的是Data Packet Service去解析数据包...

wangxuwei ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部