JavaScript设计模式学习之3
博客专区 > iPhone 的博客 > 博客详情
JavaScript设计模式学习之3
iPhone 发表于3年前
JavaScript设计模式学习之3
  • 发表于 3年前
  • 阅读 5
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 接口三
//为了实现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方法注释掉,得到的结果是:

共有 人打赏支持
粉丝 0
博文 7
码字总数 2946
×
iPhone
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: