`

Javascript中模拟接口

 
阅读更多

接口:规定一组规则,但不限定实现这些规则的具体方法,实现这些接口的类必须具有接口所规定的方法。
接口与抽象类的区别:简单而言,类与接口的关系为a live b  can do something,类与抽象类的关系为a is b,so a can do anything b can,另外,抽象类除了虚函数也可以有实现了的方法。

js中模拟根据“鸭式辨型”来模拟接口。

1.鸭式辨型:像鸭子一样走路并呱呱叫的就是鸭子,判断一个类或对象是否实现了一个接口,就检查这个类或对象是否具有接口中规定的所有方法。

2.js对象的反射机制:在程序运行过程中,可以动态检测一个类或对象具有哪些方法和属性,并可以动态执行这些方法,js对象可以用for in 来检测其成员。

for(var pro in obj)
{  //列出obj对象的属性,属性名称pro,属性值obj[pro]
  document.write(pro +":"+ obj[pro] + "<br />");   
}
 
for in 在IE和Firefox中的不同:for in 不会列出对象的默认存在的属性,如果默认属性被重写,在Firefox下会被列出,在IE下则不会。

3.检测对象的继承关系 instanceof
function Person(name,age,sex)
{
this.name=name;
this.age=age;
this.sex=sex;
}
var lily = new Person('lily',25,'female');
if(lily instanceof Person)
{
alert('lily 继承自 Person'); 
}  
 
因为任何js对象都继承自Object对象,因此对于任何js对象obj下式为true:
obj instanceof Object

js对象的易变性:js对象的属性可以被动态修改,因此即使(A instanceof B)为true,也不能保证A具有和B一样的属性,因为A从B继承来的属性可能在使用中被修改或删除掉(在C++中一个实例化的对象是不能被修改的)。

4.接口构造器
/*
Interface函数作为接口的构造器,接收2个参数,第一个为接口名称,第二个为接口要约定的一系列方法
*/
var Interface = function(name, methods)
{
if(arguments.length != 2){
throw new Error("至少需要2个参数");
}

this.name = name;
this.methods = [];

for(var i = 0, len = methods.length; i < len; i++) 
{
if(typeof methods[i] !== 'string'){
throw new Error("请使用字符串来描述接口所约定的方法.");
}
this.methods.push(methods[i]);        
}   
};

/*
 
用于检查一个对象是否实现了接口,该方法接受多个object类型参数,第一个为需要检查的对象,其余参数为该对象期望实现的接口
这是一个静态方法,这个检查方法不能被一个接口实例继承
因为不是定义在接口构造器内,也不是通过Interface.prototype来定义的
*/
Interface.ensureImplements = function(object)
{
if(arguments.length < 2) { throw new Error("至少需要2个参数"); }

//第一个参数object是类,第二个开始时类所要实现的接口
for(var i = 1, len = arguments.length; i < len; i++) 
{
var interface = arguments[i];
if(interface.constructor !== Interface)
{ throw new Error("该接口不是由接口声明函数Interface构造的"); }

for(var j = 0,methodsLen=interface.methods.length;j<methodsLen;j++)
{
var method = interface.methods[j];
if(object[method]=="undefined" || typeof object[method] !== 'function') 
{
throw new Error("接口检查: object 没有实现接口 " + interface.name + "名为" +method+ " 的方法");
}
} //end for j
} // end for i
}
 
5.使用接口构造器构造接口和检查对象是否实现了接口
var interface_1 = new Interface('interface_1', ['add', 'remove', 'getChild']);
var interface_2 = new Interface('interface_2', ['getValue']);

function Aclass(){
this.interfaces = ["interface_1","interface_2"];//该类自称实现了2个接口
this.method_1=function(){}
this.method_2=function(){}
this.add=function(){} 
this.remove=function(){}
this.getChild=function(){}
}
var myClass = new Aclass();
//使用myClass是可以检查识别它实现的接口: myClass.interfaces
//严格检查myClass是否真的实现了interface_1接口和interface_2接口
Interface.ensureImplements(myClass, interface_1, interface_2);
 
6.接口检查或多或少都会影响性能,
接口检查可以在开发中启用,在发布时关闭
使用程序之前引入一个配置文件:Conf.js,该文件在window对象下建立一个命名空间,并把一些配置参数写在该命名控件下。
Conf.js 内容:
CONF={ debugMod:true, ... }

根据
debugMod来决定是否检查接口:
if(CONF.debugMod){
Interface.ensureImplements(myClass, interface_1, interface_2);
}
 
 

分享到:
评论

相关推荐

    javascript interface all

    这篇博文将深入探讨如何在JavaScript中模拟接口,以及如何利用这些技术来提高代码的可维护性和扩展性。 首先,理解JavaScript的核心特性是关键。JavaScript基于原型继承,这意味着对象可以从其他对象继承属性和方法...

    突破JavaScript编程实例五十讲

    - 接口与抽象类:讲解在JavaScript中模拟接口和抽象类的实现策略。 9. **错误处理与调试** - 错误类型与try...catch:了解JavaScript中的错误类型,以及如何通过try...catch处理异常。 - 调试技巧:分享Chrome ...

    JavaScript接口实现代码 (Interfaces In JavaScript)

    但这并不意味着我们不能在JavaScript中模拟接口。下面我们将探讨如何在JavaScript中实现接口以及如何确保类正确地实现了它们。 首先,我们可以使用注释来声明接口,就像下面的例子所示: ```javascript /* ...

    Javascript之面向对象--接口

    在JavaScript中,虽然没有像Java或C#那样的显式接口定义,但我们可以通过使用对象的原型链来模拟接口的概念。在JavaScript中,接口可以通过定义一个对象的属性来指定,这些属性是方法,其值是函数。然后,任何继承或...

    javascript设计模式 接口介绍.docx

    JavaScript设计模式中的接口是软件开发中的一个重要概念,它在面向对象编程中起到规范和约定的作用。在强类型语言中,接口通常由语言本身提供支持,但在JavaScript这种动态类型的脚本语言中,没有内置的接口机制。...

    JavaScript接口实现方法实例分析

    然而,通过一些特定的实现策略,开发者可以在JavaScript中模拟接口的行为。 首先,我们讨论的是使用注释的方法实现接口。这种方法非常简单,但功能有限。它利用了注释而非JavaScript语言中的实际语法结构来模拟接口...

    JavaScript设计模式之接口.doc

    然而,JavaScript没有内置的接口关键字,这意味着我们需要通过某种方式来模拟接口。 在JavaScript中实现接口的一种常见方法是使用类和原型。我们可以创建一个空的构造函数(接口类),并定义其原型上的方法作为接口...

    JavaScript设计模式之接口.docx

    开发者需要使用一些技巧来模拟接口的行为。一种常见的方法是通过创建一个"接口"对象,其中包含了期望的方法名,然后检查目标对象是否拥有这些方法。例如,我们可以定义一个`MyInterface`对象,包含所有需要的方法名...

    面向对象的Javascript之二(接口实现介绍)

    不过,这并不妨碍在JavaScript中模拟接口的实现。我们可以采用几种方法来实现接口,尽管它们都不具备语言层面的强制性。 首先,我们可以使用注释来模拟接口,这是最简单但也是最弱的一种实现方式。通过在代码中使用...

    js-interface:在 js 中实现接口的部分能力

    js-interface介绍在做一个前后分离的项目时,有些头疼 Api 之类的东西要怎么管理,在阅读 一书时,第二章提到了在 JavaScript 中模拟接口 (interface) 的概念,以方便使用众多设计模式,因此尝试着做一个接口的模拟...

    接口测试的demo,用来测试restful接口的 javascript demo.zip

    在“接口测试的demo”项目中,我们重点关注的是使用JavaScript进行接口测试的方法。JavaScript是一种广泛用于前端开发的动态编程语言,但在现代Web开发中,它也被用于服务器端(例如Node.js环境)以及自动化测试场景...

    Javascript 电影购票,模拟3D场景

    在这个项目中,“Javascript 电影购票,模拟3D场景”利用JavaScript的技术力量,为用户构建了一个逼真的电影院环境,让用户能够从不同的角度预览座位,从而提升购票体验。 首先,我们来详细探讨JavaScript在3D场景...

    delphi google V8 脚本引擎接口 delphi程序 最佳 javascript 途径

    标题中的“delphi google V8 脚本引擎接口 delphi程序 最佳 javascript 途径”指的是一项技术实践,即在Delphi编程环境中利用Google的V8 JavaScript引擎创建脚本接口,以实现高效的JavaScript交互。V8是Google开发的...

    jQueryMockjax插件提供了一个简单的和非常灵活的接口用于模拟ajax请求和响应

    jQuery Mockjax是一款强大的JavaScript库,专门设计用于在开发和测试过程中模拟AJAX(Asynchronous JavaScript and XML)请求和响应。这个插件对于那些依赖于AJAX交互的前端应用尤其有用,因为它可以在没有后端...

    基于JavaScript的可视化本地部署接口管理平台

    6. **数据模拟**:允许模拟接口返回的数据,便于在开发阶段进行测试。 为了实现这些功能,开发者可能还需要用到其他技术,如JSON Schema用于接口定义,axios或fetch用于发送网络请求,以及数据库技术如SQLite或...

    JavaScript设计模式之接口.pdf

    在 JavaScript 中,我们可以使用一些技巧来模拟接口的行为。我们可以创建一个对象,该对象包含了一组方法,然后使用该对象来定义接口。例如,我们可以创建一个接口对象,如下所示: ```javascript var Interface = ...

    JavaScript模拟桌面

    在本文中,我们将深入探讨JavaScript模拟桌面涉及的关键技术和知识点。 首先,我们要理解JavaScript的基础。JavaScript是一种广泛应用于网页开发的解释型编程语言,它主要负责处理客户端的交互。在模拟桌面项目中,...

    可用模拟攒机,模拟模拟中关村攒机系统

    标题中的“可用模拟攒机,模拟模拟中关村攒机系统”表明这是一个可以模拟中关村电脑组装流程的应用或服务。这种系统通常用于教学、测试配置或者让用户在购买前预览不同硬件组合的效果。模拟攒机软件通常包括各种硬件...

    JS和WebGL中的黏菌模拟_JavaScript_GLSL_下载.zip

    源代码可能包括一个或多个JavaScript文件,用于实现模拟逻辑和WebGL接口;可能还有一个HTML文件用于构建页面结构,以及CSS文件来管理样式。资源文件可能包含图像、纹理或其他数据,用于增强模拟的视觉表现。README...

    tutorial_interface_interface_javascript_per875_

    2. **模拟接口**:介绍如何在JavaScript中通过构造函数、原型链或者ES6的类来模拟接口,确保对象符合特定的结构和行为。 3. **类型检查库**:可能会提及TypeScript,这是一种JavaScript的超集,它引入了类型系统,...

Global site tag (gtag.js) - Google Analytics