JS面向对象(三)— 接口

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

在JS中接口是面向对象最有用的工具之一,它可以提供一种说明一个对象应该具有哪些方法的手段。但是在JS中并没有接口的说明关键字interface,也没有用以实现接口的implements ,这个同前面的继承相似,只能通过模仿来描述接口。


1. 注解描述法

这种方式是通过注释的方式给出接口的描述,特点如下:
优点:对于开发的人可以有个参考
缺点:这个是属于文档的形式的,太过于松散,并没有检查接口的方法是否实现
具体的例子如下:

/*
*   interface composite{
function add(obj);
function remove(obj);
function update(obj);
}
*/

//compositeImpl implements Composite
function compositeImpl(){
}

compositeImpl.prototype.add = function(obj){};
compositeImpl.prototype.remove = function(obj){};
compositeImpl.prototype.update = function(obj){};

var c1 = new compositeImpl();
var c2 = new compositeImpl();
c1.add(7);
c2.add(9);   
//函数里用var定义的变量是局部变量,对于实例来说是相等的
alert(c1.add === c2.add);    

2. 属性检测法

显式的在类的内部,接受所实现的接口,这种方法需要在类的内部定义一个数组,但这种方法只能确定在implementsIns 中,是否包含要实现的接口,并不能确定该“接口”的方法是否被实现,总之,这种方法还是寄托于程序员的高素养。
具体的例子如下:

/*
    interface Composite{
        function add(obj);
        function remove(obj);
        fucntion update(obj);
    }

    interface FormItem{
        function select(obj);
    }

*/
//CompositeImpl  implements composite
var compositeImpl = function(){
    this.implementsIns = ['Composite', 'FormItem'];
};

compositeImpl.prototype.add = function(){
    alert('add');
};

compositeImpl.prototype.rmeove = function(){
    alert('remove');
};

compositeImpl.prototype.update = function(){
    alert('update');
};

compositeImpl.prototype.select = function(){
    alert('select');
};

function checkCompositeImpl(instance){
    if(!checkImplement(instance, 'Composite', 'FormItem')){
        throw new Error('interface do not implements');
    }
}

function checkImplement(obj){
    for(var i = 1, len = arguments.length; i < len; i++){
        var intName = arguments[i];
        var result = false;
        var ary = arguments[0].implementsIns;
        for(var j = 0, size = ary.length; j < size; j++){
            if(ary[j] == intName){
                result = true;
                break;
            }
        }
    }

    return result;
}

var c1 = new compositeImpl();
checkCompositeImpl(c1);
c1.add();  


3. 鸭式变型法

这种方法就可以确定在实现“接口”的过程中是否实现了该接口的方法,相比较于前两种方法,这种方式还是比较常用的
具体的例子如下:

function Interface(name, methods){   //记录一个接口有的抽象方法
    if(arguments.length != 2){
        throw new Error('arguments length must >= 2');
    }

    this.name = name;
    this.methods = [];
    for(var i = 0, len = methods.length; i < len; i++){
        if(typeof methods[i] !== 'string'){
            throw new Error('Interface methods should be string array');
        }

        this.methods.push(methods[i]);
    }
}


var compositeInterface = new Interface('compositeInterface', ['add', 'remove']);
var formItemInterface = new Interface('formItemInterface', ['select']);

var CompositeImpl = function(){

};

CompositeImpl.prototype.add = function(){
    alert('add');
};

CompositeImpl.prototype.remove = function(){
    alert('remove');
};

CompositeImpl.prototype.select = function(){

};

//确定实现接口的种类及它的方法是否实现
Interface.ensurePlements = function(instance, interfaceIns){
    if(arguments.length < 2){
        throw new Error('arguments should contains interfaceIns');
    }

    for(var k = 1, len = arguments.length; k < len; k++){
        var interfaceName = arguments[k];           
        if(interfaceName.constructor !== Interface){
            throw new Error('interfaceIIns constructor must be Interface');
        }

        for(var j = 0, length = interfaceName.methods.length; j < length; j++){
            var method = interfaceName.methods[j];
            if(!instance[method] || typeof  instance[method] !== 'function'){
                throw new Error('instance must implements method ' + method);
            }
        }
    }

}

var c1 = new CompositeImpl();
Interface.ensurePlements(c1, compositeInterface, formItemInterface);
c1.add();

Tip:

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

相关推荐

JavaScript中的接口:实现面向对象编程

在JavaScript中,我们可以使用对象的属性和方法来模拟接口的概念。通过定义接口的方法签名和检查对象是否具备对应的方法,我们可以实现面向对象编程中的接口特性。然而,需要注意的是,JavaScript中的接口是一种约定,并没有强制性的规定。接口面向对象编程中的一个重要概念,它定义了对象之间的契约或协议,规定了对象应该具备的属性和方法。需要注意的是,JavaScript中的接口是一种约定,而不是强制性的规定。对象实现接口的过程是基于约定的,开发者需要自行确保对象具备接口中定义的所有方法。

ByteNinja的博客 195

JavaScript的接口(Interfaces)

在现代软件开发中,接口(Interfaces)是一个至关重要的概念。它不仅在程序设计中具有极高的灵活性和可维护性,而且可以帮助我们有效地组织代码结构。在JavaScript语言中,尽管其设计上并不原生支持接口这一概念,但我们依然可以通过一些设计模和编程技巧实现类似于接口的功能。本文将深入探讨JavaScript中的接口概念,具体实现方,以及如何利用这些知识提高代码的质量和可维护性。

2401_90032085的博客 3026

JavaScript中的接口——使用Interface js

总结一下,虽然JavaScript中没有内置的接口机制,但我们可以借助第方库如Interface.js来模拟接口的行为。在JavaScript中,虽然没有内置的接口机制,但我们可以使用一些技巧和模来模拟接口的行为。在本篇文章中,我们将介绍一种名为Interface.js的库,它提供了一种简单而灵活的方来定义和实现接口。Interface.js是一个轻量级的JavaScript库,它基于约定而非语言特性,允许我们在代码中定义和使用接口接口的定义和实现之后,我们可以在其他地方使用这个接口

ByteZenith的博客 1585

js接口

解释接口:  在JavaScript的世界中,没有内置的创建或实现接口的方法,也没有可以判断一个对象是否实现了与另一个对象相同的一套方法,这使得对象之间很难互换使用,好在JavaScript拥有出色的灵活性,这使得模拟传统面向对象接口,添加这些特性并非难事。 在有内置接口的语言中,若一个类继承了某个接口,而未实现其中的一个或多个方法时,编译器会报错,从而提醒开发人员,但是javasc

weixin_41668007的博客 8202

Javascript--面向对象接口

接口:对实现某一种任务、功能,目的等,所规定的一些原则。 程序中的接口:规定好有几个方法,方法名是什么。(因程序中要完成任务,都是通过函数或者说方法去实现的。) javascript中的接口:把实例出来的某"类对象"、和实例出来的"接口对象",进行一个比较,符合规则,就可以说:这个对象实现了规定的接口; (接口类:通过这个类,来实例出不同的接口。即不同的接口实例,也就是不同的方法...

126

Javascript 面向对象接口代码

接口:对实现某一种任务、功能,目的等,所规定的一些原则 程序中的接口:规定好有几个方法,方法名是什么。(因程序中要完成任务,都是通过函数或者说方法去实现的。)javascript中的接口:把实例出来的某"类对象"、和实例出来的"接口对象",进行一个比较,符合规则,就可以说:这个对象实现了规定的接口(接口类:通过这个类,来实例出不同的接口。即不同的接口实例,也就是不同的方法个数和方法名称)(进...

匪君的博客 200

Atlas学习手记(29):JavaScript面向对象的扩展():接口Interface

在Javascript中并没有空间、类、接口这些概念,Atlas对这些东西实现封装了,增强了JavaScript面向对象方面的能力,本文看一下如何使用接口。 主要内容 1.概述 2.完整示例 一.概述 在Javascript中并没有空间、类、接口这些概念,Atlas对这些东西进行了封装,增强了JavaScript面向对象方面的能力,本文看一下如何使用接口,使用如下的方法: r...

JUDD14273的博客 150

深入js面向对象学习篇——温故知新(一)

  在学习设计模前必须要知道和掌握的***。   为类添加新方法: Function.prototype.method = function(name,fn) { this.prototype[name] = fn; } //改进版:支持链调用 Function.prototype.method = function(name,fn) { ...

a15640413555的博客 156

面向对象的Javascript

javascript本身是一种语言,他只是我们使用的一种工具,而对于编程我们使用何种思想完全取决于我们自己和我们使用的工具没有半毛钱关系。当我们自己决定使用面向对象的思想进行编程了,那么就要使用javascript这个工具来实现我们的这种思想,这就是面向对象的javascript 总结成为一句话:思想没变,形改变!

庞凡 坚定自己踏实走好每一步 1259

Js是基于对象还是面向对象

Js是基于对象还是面向对象的一、什么叫做面向对象二、什么叫做基于对象Js的特性四:js通过原链等来模拟出和面向对象很类似的功能。五:总结 一、什么叫做面向对象 面向对象大特点(封装,继承,多态)缺一不可。 所谓封装:也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单...

qq_42615057的博客 1766

简单介绍JavaScript的面向对象

任何实现该接口的类都必须提供这些方法的具体实现。

浪漫韫秋 1229

JavaScript面向对象编程:类定义、继承、接口实现

在此之前,刚接触JS面向对象的童鞋可先阅读一下这两个系列的文章:Javascript面向对象编程 和 JavaScript继承详解。 我也了解jQuery、Prototype这几个框架对面向对象的实现方,就我个人比较的结果,最后发现还是ExtJS的实现最优雅,用那种方开发出来的代码可读性更好(个人觉得)。可先参阅 ExtJS面向对象相关文档。 如果项目足够庞大的话,可以直接把ExtJS

JavaScript架构设计 1134

使用Implement.js在JavaScript中实现接口

在这篇博客文章中,我将介绍接口的概念以及它们在动态语言中的用法。 我还将使用库Implement.js将概念引入JavaScript,并向您展示如何从接口中获取一些额外的实用程序。 什么是接口? Google将界面定义为“两个系统,主题,组织等相遇并交互的点”,并且该定义对于编程中的界面也适用。 在软件开发中,接口是在对象上强制实施特定属性的结构-在大多数语言中,该对象是类。 这是Java...

编程故事的地方 2534

js面向对象

什么是面向对象

yh604005215的博客 5416

[JavaScript]JavaScript面向对象编程|OOP|继承|重写|接口

众所周知,JavaScript并没有类的概念,只有对象的概念,即万物皆对象。 因此js的OOP方法跟我们熟悉的JAVA语言等完全不同。我们能做到的,只能是利用JS语言的某些机制,去模拟一个类,并对此做继承和接口

身披白袍的博客 744
上一篇: JS面向对象(二)—继承
下一篇: JS中事件的添加
Dear_Mr
博客等级 码龄10年 102粉丝 144原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值