文档章节

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设计模式之观察者模式

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

Srtian
05/22
0
0
JavaScript设计模式系列三之单例模式(附案例源码)

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

小钱钱阿圣
2017/09/22
0
0
JavaScript 中常见设计模式-单例模式

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

webstack前端栈
05/19
0
0
你需要了解的23种JavaScript设计模式

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

java高级架构牛人
06/02
0
0
js策略模式《JavaScript设计模式与开发实践》阅读笔记

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

RoyLuo
05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu18.04下载安装Google图解法

首先Ctrl + Alt + T打开终端,或者可以在在搜索框搜索终端。 (1)sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.list.d/ ,(将下载源加入到系统的...

AI_SKI
19分钟前
0
0
spring could采坑 eureka开启验证后无法连接注册中心

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClie......

君千殇520
20分钟前
1
0
支付宝小程序下单支付接口:40004 ACQ.INVALID_PARAMETER

下面是支付宝下单接口 https://docs.open.alipay.com/api_1/alipay.trade.create/ 如果按官方文档的说明,并没有解释清楚buyer_id什么时候要传,只是说:特殊可选,啥叫特殊可选?!在调小程...

swingcoder
29分钟前
1
0
【Java】广州三本秋招经历

前言 只有光头才能变强 离上次发文章已经快两个月时间了,最近一直忙着秋招的事。今天是2018年10月22日,对于互联网行业来说,秋招就基本结束了。我这边的流程也走完了(不再笔试/面试了),所...

Java3y
31分钟前
3
0
在idea中启动多个SpringBoot项目

https://blog.csdn.net/forezp/article/details/76408139

灯下草虫鸣_
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部