JavaScript设计模式学习一之接口

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

看完了《JavaScript王者归来》,在图书馆找了《JavaScript设计模式》来看,之前设计模式方面的书看过:《Head First 设计模式》、《设计模式之禅》,GOF的《Design Patterns: Elements of Reusable Object-Oriented Software》看了一部分。记得以前没这些基础的时候,看《JavaScript设计模式》简直是不知道作者在说什么。

言归正传:

准确的说,JavaScript没有类的概念,都是对象,JavaScript是基于面向对象的语言,但是《JavaScript设计模式》的作者们非要说JavaScript是面向对象的(也不知道是不是翻译的过程中问题)。用JavaScript来描述那些设计模式的时候,需要通过JavaScript的一些特性(比如说闭包、原型)来模拟Java、C++等面向对象语言的一些特性(比如说类、接口、继承、public、private)。


书中说了三种模拟Interface的方法

第一种:用注释描述接口

我觉得这个就是一种内部约定,直接说“我实现了XX接口”,在语言上我个人觉得一点约束力都没有,这真不应该拿出来说,有点滥竽充数的感觉。

第二种:用属性检查模仿接口

需要一个叫做implements()的函数进行检查

 function implements(object){
	for(var i=1;i<arguments.length;i++){
		var interfaceName = arguments[i];
		var interfaceFound = false;
		for(var j=0;j<object.implementsInterfaces.length;i++){
			if(object.implementsInterfaces[j] == interfaceName){ 	//implementsInterfaces保存了接口定义的方法的名称
				interfaceFound = true;
				break;
			
			}
		
		}
		if(!interfaceFound){
			return false; 	//接口没有找到
		}
	}
	return true;
 }


这是《JavaScript设计模式》书中的一部分代码,作者的描述是这样的:

这种方法有几个优点。它对类所实现的接口提供了文档说明。如果需要的接口不在一个类宣称支持的接口之列,你会看到错误消息。通过利用这些错误,你可以强迫其他程序员声明这些接口。这种方法的主要缺点在于它并未确保类真正实现了自称实现的接口。只知道它是否说自己实现了接口,在创建一个类声明它实现了一个接口,但后来在实现该接口方法所规定的方法时却漏掉其中的某一个,找一个错误很常见,此时所有的检查都能通过,但那个方法却并不存在,这将在代码中埋下一个隐患。


随即引出了第三中方法:用鸭式辨型模仿接口

原理:如果对象具有与接口定义的方法同名的所有方法,那么就可以认为它实现了这个接口。

首先需要一个接口类Interface

 var Interface = function(name ,methods){
	……
 }
接受两个参数:接口名称,方法名


这个Interface类还有一个静态方法 ensureImplements()

 Interface.ensureImplements = function(object){
	……
			
}

实际用法是这样的:

 
 var Composite = new Interface('Composite',['add','remover','getChild']);
 var FormItem = new Interface('FormItem',['save']);
 
 var CompositeForm = function(id,method,action){
	……
 
 }
 
 function addForm(formInstance){
	ensureensureImplements(formIntance,Composite,FormItem);
	//This function will throw an error if a required method is not implemented
	……
 }

最后作者采用第一种和第三种方法实现接口,代码如下:

 var Interface = function(name,methods){
	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, len = methods.length;i<len;i++){
		if(type methods[i] !=='string'){
			throw new Error("Interface constructor expects method names to be passed in as a string");
		}
		this.methods.push(methods[i]);
	}
 };
 
 Interface.ensureImplements = function(object){
	if(arguments.length<2){
		throw new Error("Function Interface.ensureImplements call with"+arguments.length
		+"arguments,but expected at least 2.");
	}
	for(var i=1,len = arguments.length;i<len;i++){
		var interface = arguments[i];
		if(interface.constructor !== Interface){
			throw new Error("Function Interface.ensureImplements expects arguments two and "+
			"above to be instance of Interface");
		}
		for(var j=0, methodslen = interface.methods.length;j<methodslen;j++){
			var method = interface.methods[j];
			if(!object[method] || typeof object[method]!=='function'){
				throw new Error("function Interface.ensureImplements:object"+
				"does not implements the"+interface.name+"interface.Method"+method+"was not found");
			}
		
		}
	
	};
 


JavaScript在我之前乃至现在的印象中,他就是应用在浏览器客户端的的一个脚本语言,主要的应用对象是浏览器,他需要这么大费周章的去模拟类似java的特性吗?有这个需求吗?我现在还没发现,以后可能能发现。

设计模式在我的理解就是四个字:解耦、复用。

可能是我现在需求还没那么高,,没办法理解设计模式在JavaScript里作用



JavaScript 设计模式 —— 接口 接口提供了种用以说明个对象应该具有哪些方法的手段。尽管它可以表明(或至少是暗示)这些方法的语义,但它并不规定这些方法应该如何实现。例如,如果接口包含有个名为setName的方法,那么你有理由认为这个方法的实现应该具有个字符串参数,并且会把这个参数赋给个name变量。有了这个工具,你就能按对象提供的特性对它们进行分组。 阅读详情

相关推荐

javascript学习——ParentNode 接口,ChildNode 接口

节点对象除了继承 Node 接口以外,还拥有其他接口。ParentNode接口表示当前节点是个父节点,提供些处理子节点的方法。ChildNode接口表示当前节点是个子节点,提供些相关方法。

白话机器学习 1515

Node.js 编写接口入门学习(GET、POST)

nvm 安装、卸载与使用(详细步骤),用于管理/切换Node多版本环境。node是否安装成功$ node -v安装完成之后,通过node直接运行test.js。# 命令行执行 $ node test.js

卡尔特斯 2861

文学会 JavaScriptJS)——从入门到精通(超详尽教程)

目标读者:刚学完 HTML/CSS,或希望系统掌握现代 JavaScript 的开发者。本教程尽可能覆盖语言核心、异步机制、浏览器 API、工程实战与最佳实践,学完你能独立完成小型前端项目并理解进阶主题。

A6666689S的博客 3469

js实现接口的几种方式

Javascript模仿接口可以有三种方式:1.注释法 2.检查属性法 3.鸭式辨形法 1.注释法:此方法属于程序文档范畴,对接口的继承实现完全依靠程序员自觉 /* interface People{ function createHead(); function createBody(); } */ var woman = f...

weixin_30892987的博客 762

JavaScript -- API学习

之前我们专业进行实习的时候,接触过Javascript,也有过定的了解。但是也就算是入门10%,要想写出好的Web还是很困难的,所以今天开始,进行我Javascript之路的学习。有的朋友有可能会认为这么简单也要记载嘛?其实这个博客嘛,主要是为自己查阅方便,第二才是供外人参考。当然,我得文笔不行,写着写着肯定会变好的,对不?好了废话不多说,来增强自己的人生价值吧!!! 、Jav...

坤少IT之路 636

JavaScript-Dom接口学习基础知识

、DOM简介 1.1什么是DOM1.2 DOM树 二、获取元素 2.1如何获取页面元素 2.2 根据ID获取 2.3 根据标签名获取 2.4 通过HTML5新增的方法获取 2.5 获取特殊元素 (body,html) 三、事件基础 3.1事件概述 3.2事件三要素 3.3 执行事件的步骤 3.4 常见的鼠标事件 四、操作元素(Dom接口学习重点)4.1 改变元素内容 4.2常用元素的属性操作 4.3 表单元素的属性操作 4.4 样式属性操作 4.5 排他思想 4.6 自定义属性的操作 4.7

weixin_45026839的博客 378

JS设计模式书籍、原则

圣经书:JavaScript 高级程序设计 设计模式:DesignPatterns by Erich Gamma、Richard Hlem、Ralph Johnson 、Jhon Vlissides   设计原则:想像类的构造 1、开闭原则,继承父类 重写方法,不修改方法。 2、里氏转换原则,继承父类,拥有父类方法。 4、接口隔离。 5、合成复用,新对象组合已有对象。

Kangl的博客 446

深入探索与学习JavaScript设计模式(附20个常用JS设计模式

JavaScript设计模式为你提供了种结构化的、可重复的方法来解决JavaScript开发中经常出现的问题。在本指南中,我们将看看什么是JavaScript设计模式以及如何在你的JavaScript应用程序中使用它们。

WPHunter的编程技术资料库! 1508

JavaScript设计模式》初次笔记——wsdchong

JavaScript设计模式》初次笔记 前言 设计模式直久仰大名,但是没有去花时间去了解,于是今天特意花时间去看《JavaScript设计模式》(2013年6月出版)和w3cschool上的设计模式。然后做了些笔记。 以《JavaScript设计模式》为目录,以w3cschool上的设计模式为补充。 讲的内容有三:设计模式JavaScript设计模式、其他(模块化的JavaScript设计模式、jQuery设计模式、jQuery插件设计模式)。 学习目的:尝试性地了解JavaScript设计模式,方

wsdchong的博客 1万+

JavaScript学习手册JS简介

第1关:JavaScript 语言介绍、注释及基本输出方式 任务描述 要了解门编程语言,要从输出开始。 本关任务:采用相关知识中介绍的任意种方法输出“ Hello, JavaScript! ”。 相关知识 JavaScript 语言简介 JavaScript 诞生于1995年。在那个时代用户提交个表单需要获取服务器端的反馈,这个时间大概十几秒,如果能在客户 qa 端完成些基本的验证绝对是很大的进步。当时如日中天的 Netscape 公司,决定着手开发种客户端语言解决简单的表单验证。就职

weixin_54327001的博客 1万+

JavaScript设计模式Interface接口

什么是接口接口提供了种用以说明个对象应该具有哪些方法和手段。 在面向对象的javascript中,接口有些什么作用呢?既定的接口具有自我描述性,并能促进代码重用。接口可以告诉程序员个类实现了哪些方法,从而帮助其使用这个类。 在C#还是JAVA中都应该面向接口设计我们的程序,在C#和Java中都Interface这样的关键字,但是JavaScript中没有相应的机制,但是Java...

weixin_30477797的博客 1793

JavaScript设计模式

JavaScript设计模式 **设计模式:**代码经验的总结,是可重用的用于解决软件设计中般问题的方案。 设计模式都是面向对象的。 学习设计模式,有助于写出可复用和可维护性高的程序。 常用的12种设计模式: 工厂模式 单例模式 原型模式 适配器模式 代理模式 策略模式 迭代器模式 观察者模式 发布-订阅模式 命令模式 组合模式 建造者模式 设...

林夏天的博客 7160

JavaScript 设计模式

欢迎您!JavaScript 设计模式是允许我们在 JavaScript 中编写更健壮、可扩展和可扩展应用程序的技术。JavaScript 是网络浏览器中可用的主要编程语言,也是支持超出浏览器之外的最受欢迎的编程语言之设计模式是解决常见问题的解决方案,可以重复使用。最常讨论的设计模式来自面向对象编程的世界。JavaScript 作为个轻量级、多范式、动态、单线程的语言,与其他主流编程语言相比,具有不同的优势和劣势。软件工程师通常除了精通另种编程语言外,还会使用 JavaScript。JavaScri

龙哥盟 1118

JavaScript 23种经典设计模式简介

23种JavaScript经典设计模式

前端梦工厂 1453

javaScript设计模式

JavaScript设计模式种在JavaScript开发中常用的编程模式,用于解决特定问题的代码组织和架构。通过使用设计模式,可以提高代码的可读性、可维护性和可扩展性。以下是几种常见的JavaScript设计模式:单例模式(Singleton Pattern):确保个类只有个实例,并提供全局访问点。工厂模式(Factory Pattern):根据参数的不同,创建不同的对象实例,隐藏具体的实现细节。

m0_74242675的博客 1412

前端Javascript设计模式学习

设计模式是我们在 解决问题的时候针对特定问题给出的简洁而优化的处理方案在 JS 设计模式中,最核心的思想:封装变化。将变与不变分离,确保变化的部分灵活、不变的部分稳定。

警警的博客 1426

JavaScript设计模式学习笔记(

JavaScript设计模式学习笔记(学习设计模式的目的二、模式分类创建型模式结构型模式行为型模式 本系列博客主要是面向自己创作,实属自己的读书笔记,注重记录些重点,并摘录引用些大佬对于部分知识点的解释,帮助自己翻阅和理解,定要配合原著食用。

qq_36013952的博客 396

JavaScript 深度学习

原文:zh.annas-archive.org/md5/ea99677736c22d68b5818a18b5a9213a 译者:飞龙 协议:CC BY-NC-SA 4.0 第部分:动机与基本概念 第部分 包括个单独的章节,为您介绍将构成本书其余部分背景的基本概念。这些包括人工智能、机器学习和深度学习以及它们之间的关系。第章 还探讨了在 JavaScript 中实践深度学习的价值和潜力。 第章:深度学习JavaScript 本章内容 深度学习是什么以及它与人工智能(AI)和机器学习的关系

龙哥盟 1495
上一篇: 今天笔试,我很惭愧
下一篇: MySQL从外部文件导入数据
ZPH2254
博客等级 码龄16年 39粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值