文档章节

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
你需要了解的23种JavaScript设计模式

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

java高级架构牛人
06/02
0
0
JavaScript 中常见设计模式-单例模式

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

webstack前端栈
05/19
0
0
js策略模式《JavaScript设计模式与开发实践》阅读笔记

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

RoyLuo
05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
1
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
1
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
3
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部