文档章节

JavaScript设计模式学习之3

iPhone
 iPhone
发布于 2015/04/08 16:41
字数 513
阅读 5
收藏 0
点赞 0
评论 0
//为了实现JS接口我们也是蛮拼的,弱类型实现一个其他强类型的特性总会感觉很奇怪,
// 好在弱类型的灵活性让它在语言层面上能够模仿其他强类型语言的特性
//这里接口实现方法叫鸭式辨型模仿,就是检查类有没有实现具体的方法,所以,我们需要检查实例是否存在对应的方法
// 定义接口


var IComposite = new Interface('IComposite', ['add', 'remove', 'getChild']);
var IFormItem = new Interface('IFormItem', ['save']);
//看上面就是我们定义的接口,有接口名称和接口方法,我们需要根据这些去判断
function Interface(name, _method) {
	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; i < _method.length; i++) {
		if (typeof _method[i] !== 'string') {
			throw new Error("Interface constructor expected method names to be passed in as a string");
		}
		this.methods.push(_method[i]);
	}
}
var CompositeForm = function(id, data) {
	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");
}

var addForm = function(instance,child) {
	Interface.ensureImplements(instance, IComposite, IFormItem);
	return instance.add(child);
}

//写到这里,我们还没有具体实现Interface类和ensureImplements方法,接下来实现它

Interface.ensureImplements = function(object) {
	//还是和之前的一样,但是这里是匹配接口的方法数组
	if (arguments.length < 2) {
		throw new Error("function instance.ensureImplements called with " + arguments.length +
			" arguments,but expected at least 2");
	}
	for (var i = 1; i < arguments.length; i++) {
		var instance = arguments[i];
		if (instance.constructor != Interface) {
			throw new Error("接口必须是通过Interface来定义的...");
		}
		for (var j = 0; j<instance.methods.length; j++) {
			//取得接口方法,下一步是判断该方法在实例中有没有实现
			var method = instance.methods[j];
			if (!object[method] || typeof object[method] !== 'function') {
				throw new Error("接口的实现方法不存在或者必须是一个function and method is :"+method);
			}
		}
	}
}

//好了,这里可以用addFrom了
var form=new CompositeForm(1,[1,'hello','world',{asd:"123"}]);
console.log(addForm(form,"接口3"));

如果把原型链中的save方法注释掉,得到的结果是:

© 著作权归作者所有

共有 人打赏支持
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

ES7 Decorator 装饰者模式

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

_朴灵_ ⋅ 05/14 ⋅ 0

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

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

uplyw ⋅ 05/26 ⋅ 0

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

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

webstack前端栈 ⋅ 06/15 ⋅ 0

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

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

Lee_tanghui ⋅ 04/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nginx服务架构初探(四):nginx服务器的rewrite功能

nginx服务器的rewrite功能 1.nginx后端服务器组的配置 1>upstream name {…} name是给服务器组限的组名 2>server address [parameters]; address为服务器地址 parame......

余温灬未存 ⋅ 今天 ⋅ 0

layer.prompt使文本框为空的情况下也能点击确定

最近一直在使用layui,但是用到弹出层layer.prompt时,如果文本框是空的话点击确定没有反应,不能向下执行。 但是我又需要空值,看看我原来的代码。 123456789 layer.prompt...

孟飞阳 ⋅ 今天 ⋅ 0

Linux普通文件压缩工具gzip、Bzip2、xz

第六章 文件压缩和打包 6.1 压缩打包介绍 Linux环境常见压缩文件类型: .zip,.gz,.bz2,.xz, .tar.gz,.tar.bz2,.tar.xz 压缩打包的目的 方便文件传输 节省磁盘空间 减少传输花费的时间 ...

弓正 ⋅ 今天 ⋅ 0

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

阿里云云栖社区 ⋅ 今天 ⋅ 0

zabbix短信报警统计以及报表展示

一、需求 由于我们的业务报警比较频繁,之前是针对每个报警进行具体处理,但是有时还会重复出现,或者后续处理有时忘记跟进等,因此进行报警短信的统计,可以针对一些问题与业务跟进,明确后...

o翡翠谷o ⋅ 今天 ⋅ 0

JNI 输出LOG

1、导入log头文件。在你使用的 .c/ .cpp 文件中,导入 log.h 头文件。 #include<android/log.h> 2、在android.mk 加上 LOCAL_LDLIBS := -llog 或 LOCAL_SHARED_LIBRARIES := liblog 3、定义L......

国仔饼 ⋅ 今天 ⋅ 0

主线程pthread_exit 作用

#include <iostream>#include <pthread.h>#include <unistd.h>using namespace std;#define NUM_THREADS 10void* say_hello(void* args){ int i = *((int*)args);/......

xxdd ⋅ 今天 ⋅ 0

崛起于Springboot2.X之Mybatis-xml方式操作mysql数据库(3)

序言:当第一篇讲道Mybatis的时候,只要使用过mybatis的java程序员100%都会知道这种方式,因为这是最广泛最全面的编写sql操作mysql数据库的方式,高级sql的编写往往通过xml方式,接下来进入正...

木九天 ⋅ 今天 ⋅ 1

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

猫耳m ⋅ 今天 ⋅ 0

spring elasticsearch 2.4 date 日期

1.mappingPUT user_behavior { "mappings": { "user_behavior": { "properties": { "date": { "type": "createDate", ......

xiaomin0322 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部