文档章节

JavaScript设计模式学习之3

iPhone
 iPhone
发布于 2015/04/08 16:41
字数 513
阅读 5
收藏 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 中常见设计模式-单例模式

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

webstack前端栈
05/19
0
0
Javascript设计模式与开发实践详见(一:单例模式)

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设...

littl_Prince
2016/04/05
0
0
JavaScript设计模式之观察者模式

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

Srtian
05/22
0
0
《JavaScript设计模式与开发实践》模式篇(3)—— 代理模式

代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问 故事背景: 假设当 A 在心情好的时候收到花,小明表白成功的几率有 60%,而当 A 在心情差的时候收到花,小明表白的成功率无...

嗨呀豆豆呢
前天
0
0
JavaScript设计模式系列三之单例模式(附案例源码)

文章初衷 设计模式其实旨在解决语言本身存在的缺陷 目前javaScript一些新的语法特性已经集成了一些设计模式的实现, 大家在写代码的时候,没必要为了用设计模式而去用设计模式, 那么我这边为什...

小钱钱阿圣
2017/09/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
16
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
10
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部