目次
インターフェースとは
インターフェイスの利点
JavaScript 模倣インターフェース
クラス継承を使用してインターフェイスをシミュレートしました。具体的な実装についてはコードを参照してください。
ホームページ ウェブフロントエンド フロントエンドQ&A JavaScriptのインターフェースとは何ですか

JavaScriptのインターフェースとは何ですか

Oct 27, 2021 pm 06:02 PM
javascript インターフェース

JavaScript では、インターフェイスはコントラクトを定義する参照型を指します。インターフェイスは実際にクラスがどのようなメソッドを実装しているかを示し、それによってこのクラスの使用を支援します。インターフェイスによりコードがより安定します。

JavaScriptのインターフェースとは何ですか

このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。

JavaScript にはインターフェイスを作成または実装する組み込みの方法はありません。また、あるオブジェクトが別のオブジェクトと同じメソッドのセットを実装しているかどうかを判断する組み込みメソッドもありません。このため、オブジェクトを互換的に使用することが困難になります。しかし、JavaScript は非常に柔軟なので、他の方法でも実装できます。

インターフェースとは

インターフェースは実際にオブジェクト内にどのようなメソッドを含めるべきかを定義します。これらのメソッドがどのように実装されるかを考慮する必要はありませんが、オブジェクトがこれらのメソッドを持つことを定義します。

インターフェイスは、合意を定義する参照タイプを指します。他の型は、特定の操作を確実にサポートするためにインターフェイスを実装します。インターフェイスは、それを実装するクラスまたは他のインターフェイスによって提供される必要があるメンバーを指定します。クラスと同様に、インターフェイスにはメソッド、プロパティ、インデクサー、およびイベントをメンバーとして含めることができます。

インターフェイスの利点

インターフェイスは、実際にクラスがどのメソッドを実装しているかを示します。これは、このクラスを使用するのに役立ちます。インターフェイスにメソッドを追加すると、インターフェイスによりコードがより安定します。これを実装するクラスがこのメソッドをそれに応じて追加しない場合、間違いなくエラーがスローされます。

JavaScript 模倣インターフェース

JavaScript 模倣インターフェースには 3 つのメソッドがあります:

  • コメント メソッド

  • #属性チェック方法

  • ##ダック変換方法

##コメントを使用してインターフェイスを説明する

コメントを使用してインターフェイスを説明するのは最も簡単な方法ですが、効果は最悪です。

/*
interface Composite {
    function add(child);
    function remove(child);
    function getChild(index);
}

interface FormItem {
    function save();
}
*/

class CompositeForm {
    add(child) {
        //...
    }
    remove(child) {

    }
    getChild(index) {
        //...
    }
    save() {
        //...
    }
}
ログイン後にコピー

この模倣メソッドはあまり良くありません。CompositeForm がメソッドを正しく実装しているかどうかはチェックしません。完全にプログラマーがアノテーション内のインターフェイスを意識的に実装しています。ただし、この実装は非常に単純ですが、テストやデバッグには役に立ちません。

インターフェースを模倣した属性チェック方法

この方法はより慎重ですが、インターフェースもコメント形式で記述されていますが、チェックすることで特定のクラスを知ることができます。属性 どのようなインターフェイスを実装すると主張していますか?

class CompositeForm {
    constructor() {
        this.implementsInterface = ['Composite', 'FormItem'];
    }
}

function addForm(formInstance) {
    if (!implements(formInstance, 'Composite', 'FormItem')) {
        throw new Error('对象没有实现接口方法');
    }
}

function implements(obj) { // 这个方法查询接口
    for (let i = 1; i < arguments.length; i++) {
        let interfaceName = arguments[i];
        let interfaceFound = false;
        for (let j = 1; j < obj.implementsInterface.length; j++) {
            if (obj.implementsInterface[j] == interfaceName) {
                interfaceFound = true;
                break;
            }
        }
        if (!interfaceFound) {
            return false;
        }
        return true;
    }
}

addForm(new CompositeForm());
ログイン後にコピー

このメソッドの利点は、クラスによって実装されたインターフェイスのドキュメントが提供されることです。必要なインターフェイスが、クラスがサポートするように宣言しているインターフェイスの中にない場合 (つまり、このメソッドに含まれていない場合) .implementsInterface) ) を実行すると、エラー メッセージが表示されます。

欠点も明らかで、this.implementsInterface で宣言されたインターフェイスがコメントで定義されたインターフェイスと異なっていてもチェックに合格できる場合、addForm メソッドの呼び出しでエラーが発生しないことを意味します。

ダック変換を使用したインターフェイスのシミュレート

#実際、クラスがこれらのメソッドを持っている限り、サポートするインターフェイスを宣言するかどうかは問題ではありません。インターフェース。 Duck 変換では、オブジェクトがインスタンスであるかどうかを判断するための唯一の基準として、オブジェクトのメソッド セットが使用されます。実装原理も非常に単純です。オブジェクトにインターフェイスによって定義されたメソッドと同じ名前のメソッドがある場合、そのオブジェクトはインターフェイスを実装していると見なされます。
// interface
class Interface {
    constructor(name, method) {
        if (arguments.length != 2) {
            throw new Error('两个参数:name method');
        }
        this.name = name;
        this.method = [];
        for (let i in method) {
            if (typeof method[i] != 'string') {
                throw new Error('method 必须是字符串');
            }
            this.method.push(method[i]);
        }
    }
    //检查接口方法
    static ensureImplements(obj) {
        if (arguments.length < 2) {
            throw new Error('参数小于两个');
        }

        for (let i = 1; i < arguments.length; i++) {
            var instanceInterface = arguments[i];
            if (instanceInterface.constructor !== Interface) {
                throw new Error('你要检查的参数不属于Interface接口')
            }

            for (let j in instanceInterface.method) {
                let methodName = instanceInterface.method[j];
                if (!obj[methodName] || typeof obj[methodName] !== 'function') {
                    throw new Error(`请实现接口的${methodName}方法`)
                }
            }
        }
    }
}

// 实例化接口对象
var Composite = new Interface('Composite', ['add', 'remove', 'getChild']);
var FormItem = new Interface('FormItem', ['save']);

// CompositeForm  类
class CompositeForm {
    //...
    add() {}
    remove() {}
    getChild() {}
}

let c1 = new CompositeForm();
Interface.ensureImplements(c1, Composite, FormItem);

function addForm(formInterface) {
    ensureImplements(formInterface, Composite, FormItem);
}
ログイン後にコピー

上記のコードでは、CompositeForm クラスに save メソッドを実装していません。このコードを実行するとエラーが発生します。

しかし、アヒル変換方法にも欠点があり、すべての検査側面が必須です。

この新人の実装方法 > 私は継承メソッドと呼んでいます

クラス継承を使用してインターフェイスをシミュレートしました。具体的な実装についてはコードを参照してください。

最初に、インターフェイスとして使用されるクラスを定義します。属性メソッドは、インターフェイスのメソッド セットを表します。

class Interface {
    constructor() {
        this.mehods = ['add', 'save', 'remove', 'save'];
    }
    static ensureImplements(obj) {
        //...
    }
}
ログイン後にコピー
このインターフェイスを継承する CompositeForm クラスを定義し、そのインターフェイスの ensureImplements メソッドを呼び出します。インターフェイスを検出するクラスの親クラス

class CompositeForm  extends Interface{
    constructor() {
        super().ensureImplements(this);
    }
}
ログイン後にコピー
ensureImplements メソッドを改善する

class Interface {
    constructor() {
        this.mehods = ['add', 'save', 'remove', 'save'];
    }
    static ensureImplements(obj) {
        for (let i in this.mehods) {
            let methodName = this.mehods[i]
            if (!obj[methodName] || typeof obj[methodName] !== 'function') {
                let err = '请实现接口' + methodName + '的方法';
                throw new Error(err);
            }
        }
    }
}
ログイン後にコピー
[推奨学習:

javascript 上級チュートリアル

]

以上がJavaScriptのインターフェースとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

コンピュータのマザーボードの内部インターフェイスとは何ですか? コンピュータのマザーボードの内部インターフェイスに関する推奨される入門 コンピュータのマザーボードの内部インターフェイスとは何ですか? コンピュータのマザーボードの内部インターフェイスに関する推奨される入門 Mar 12, 2024 pm 04:34 PM

パソコンを組み立てる際、設置作業は簡単ですが、誤ってCPUラジエーターの電源線をSYS_FANに差し込んでしまうなど、配線に問題が発生することが多く、ファンは回転しますが、ファンが回転しない場合があります。コンピュータの電源がオンになると、F1 エラー「CPUFanError」が発生し、CPU クーラーがインテリジェントに速度を調整できなくなります。コンピューターのマザーボード上の CPU_FAN、SYS_FAN、CHA_FAN、および CPU_OPT インターフェイスに関する一般的な知識を共有しましょう。コンピュータのマザーボード上の CPU_FAN、SYS_FAN、CHA_FAN、および CPU_OPT インターフェイスに関する一般科学 1. CPU_FANCPU_FAN は、CPU ラジエーター専用のインターフェイスであり、12V で動作します。

Go 言語の一般的なプログラミング パラダイムと設計パターン Go 言語の一般的なプログラミング パラダイムと設計パターン Mar 04, 2024 pm 06:06 PM

最新の効率的なプログラミング言語である Go 言語には、開発者が高品質で保守可能なコードを作成するのに役立つ豊富なプログラミング パラダイムと設計パターンがあります。この記事では、Go 言語の一般的なプログラミング パラダイムと設計パターンを紹介し、具体的なコード例を示します。 1. オブジェクト指向プログラミング Go 言語では、構造体とメソッドを使用してオブジェクト指向プログラミングを実装できます。構造を定義し、その構造にメソッドをバインドすることにより、データのカプセル化と動作バインディングのオブジェクト指向機能を実現できます。パッケージマイニ

PHP インターフェースの概要とその定義方法 PHP インターフェースの概要とその定義方法 Mar 23, 2024 am 09:00 AM

PHP インターフェースの概要とその定義方法 PHP は、Web 開発で広く使用されているオープンソースのスクリプト言語であり、柔軟性があり、シンプルで強力です。 PHP では、インターフェイスは複数のクラス間で共通のメソッドを定義し、ポリモーフィズムを実現し、コードをより柔軟で再利用可能にするツールです。この記事では、PHP インターフェイスの概念とその定義方法を紹介し、その使用法を示す具体的なコード例を示します。 1. PHP インターフェイスの概念 インターフェイスはオブジェクト指向プログラミングにおいて重要な役割を果たし、クラス アプリケーションを定義します。

NotImplementedError() の解決策 NotImplementedError() の解決策 Mar 01, 2024 pm 03:10 PM

エラーの原因は Python にあり、Tornado で NotImplementedError() がスローされるのは、抽象メソッドまたはインターフェイスが実装されていないことが原因である可能性があります。これらのメソッドまたはインターフェイスは親クラスで宣言されますが、子クラスでは実装されません。サブクラスが適切に動作するには、これらのメソッドまたはインターフェイスを実装する必要があります。この問題を解決するには、親クラスで宣言した抽象メソッドやインターフェイスを子クラスに実装します。別のクラスから継承するクラスを使用していてこのエラーが発生した場合は、親クラスで宣言されたすべての抽象メソッドを子クラスに実装する必要があります。インターフェイスを使用していてこのエラーが発生した場合は、インターフェイスで宣言されているすべてのメソッドを、インターフェイスを実装するクラスに実装する必要があります。どちらかわからない場合は、

Honmeng システムの洞察: 実際の機能測定と使用体験 Honmeng システムの洞察: 実際の機能測定と使用体験 Mar 23, 2024 am 10:45 AM

Huawei が発表した新しいオペレーティング システムとして、Hongmeng システムは業界で大きな波紋を引き起こしました。米国の禁止措置を受けてのファーウェイの新たな試みとして、紅夢システムには大きな期待と期待が寄せられている。最近、幸運にもHongmengシステムを搭載したHuaweiの携帯電話を入手したので、一定期間使用して実際にテストした後、Hongmengシステムの機能テストと使用体験を共有します。まず、Hongmeng システムのインターフェースと機能を見てみましょう。 Honmeng システムは全体的に Huawei 独自のデザインスタイルを採用しており、シンプル、明確、スムーズな操作性を備えています。デスクトップ上には、さまざまな

Java でのインターフェイスと抽象クラスの内部クラス実装 Java でのインターフェイスと抽象クラスの内部クラス実装 Apr 30, 2024 pm 02:03 PM

Java では、インターフェイスおよび抽象クラス内で内部クラスを定義できるため、コードの再利用とモジュール化に柔軟性が提供されます。インターフェイスの内部クラスは特定の関数を実装できますが、抽象クラスの内部クラスは一般的な関数を定義でき、サブクラスは具体的な実装を提供します。

Java のデザイン パターンにおけるインターフェイスと抽象クラスの適用 Java のデザイン パターンにおけるインターフェイスと抽象クラスの適用 May 01, 2024 pm 06:33 PM

インターフェイスと抽象クラスは、分離と拡張性のためにデザイン パターンで使用されます。インターフェイスはメソッド シグネチャを定義し、抽象クラスは部分的な実装を提供し、サブクラスは未実装のメソッドを実装する必要があります。ストラテジ パターンでは、インターフェイスを使用してアルゴリズムを定義し、抽象クラスまたは具象クラスが実装を提供するため、アルゴリズムを動的に切り替えることができます。オブザーバー パターンでは、インターフェイスを使用してオブザーバーの動作を定義し、抽象クラスまたは具象クラスを使用して通知をサブスクライブおよびパブリッシュします。アダプター パターンでは、インターフェイスを使用して既存のクラスを適応させることができ、互換性のあるインターフェイスを実装できるため、元のコードとの対話が可能になります。

Java インターフェースと抽象クラス: それらの間の内部接続を明らかにする Java インターフェースと抽象クラス: それらの間の内部接続を明らかにする Mar 04, 2024 am 09:34 AM

インターフェイス インターフェイスは、Java の抽象メソッドと定数を定義します。インターフェイス内のメソッドは実装されていませんが、インターフェイスを実装するクラスによって提供されます。このインターフェイスは、実装クラスが指定されたメソッド実装を提供することを要求するコントラクトを定義します。インターフェイスを宣言します。 publicinterfaceExampleInterface{voiddoSomething();intgetSomething();} 抽象クラス 抽象クラスは、インスタンス化できないクラスです。これには、抽象メソッドと非抽象メソッドが混在しています。インターフェイスと同様に、抽象クラスの抽象メソッドはサブクラスによって実装されます。ただし、抽象クラスには、デフォルトの実装を提供する具象メソッドを含めることもできます。抽象クラスを宣言: publicabstractcl

See all articles