JavaScript にはインターフェース型 (Java の「インターフェース」など) がありますか? 質問する

JavaScript にはインターフェース型 (Java の「インターフェース」など) がありますか? 質問する

勉強中ですJavaScript で OOP を作る方法interfaceインターフェースの概念(Java のような)がありますか?

そうすればリスナーを作成できるようになります...

ベストアンサー1

「このクラスにはこれらの関数がなければならない」という概念はありません (つまり、インターフェース自体はありません)。その理由は次のとおりです。

  1. JavaScript の継承はクラスではなくオブジェクトに基づいています。次のことを理解するまでは、これは大した問題ではありません。
  2. JavaScript は極めて動的な型付け言語です。適切なメソッドを使用してオブジェクトを作成し、それをインターフェースに適合させてから、それを適合させたすべてのものを未定義にすることができます。型システムを破壊してしまうことは非常に簡単で、たとえ偶然であっても、型システムを作成しようとする価値はありません。

代わりに、JavaScriptはダックタイピング(アヒルのように歩き、アヒルのように鳴くなら、JS にとってはそれはアヒルです。) オブジェクトに quack()、walk()、fly() メソッドがある場合、コードは、歩く、鳴く、飛ぶことができるオブジェクトが期待される場所であればどこでも、何らかの "Duckable" インターフェイスの実装を必要とせずに、そのメソッドを使用できます。インターフェイスは、コードが使用する関数のセット (およびそれらの関数からの戻り値) とまったく同じであり、ダック タイピングを使用すると、それが無料で得られます。

ただし、途中でコードが失敗しないというわけではありません。 を呼び出そうとするとsome_dog.quack()、TypeError が発生します。率直に言って、犬にクワクワと鳴くように指示する場合は、少し大きな問題があります。ダック タイピングは、いわばすべてのアヒルを一列に並べ、犬とアヒルを一般的な動物として扱っている場合を除き、混ざり合わないようにした場合に最もうまく機能します。言い換えると、インターフェイスは流動的ですが、それでも存在します。そもそも犬がクワクワと鳴いて飛ぶことを期待するコードに犬を渡すと、多くの場合エラーになります。

しかし、正しいことをしていると確信しているなら、特定の方法を使用する前にその方法の存在をテストすることで、犬の鳴き声の問題を回避することができます。たとえば、

if (typeof(someObject.quack) == "function")
{
    // This thing can quack
}

そうすれば、使用できるすべてのメソッドを、使用する前にチェックできます。ただし、構文は少々見苦しいです。もう少しきれいな方法があります。

Object.prototype.can = function(methodName)
{
     return ((typeof this[methodName]) == "function");
};

if (someObject.can("quack"))
{
    someObject.quack();
}

これは標準の JavaScript なので、使用する価値のあるどの JS インタープリターでも動作するはずです。英語のように読めるという利点もあります。

最新のブラウザ (つまり、IE 6-8 以外のほぼすべてのブラウザ) では、プロパティが表示されないようにする方法もありますfor...in

Object.defineProperty(Object.prototype, 'can', {
    enumerable: false,
    value: function(method) {
        return (typeof this[method] === 'function');
    }
}

問題は、IE7 オブジェクトには がまったくなく.defineProperty、IE8 ではホスト オブジェクト (つまり、DOM 要素など) でのみ機能するという点です。互換性が問題になる場合は は使用できません.defineProperty。(IE6 については言及しません。中国以外ではもはや無関係だからです。)

もう 1 つの問題は、一部のコーディング スタイルでは、誰もが悪いコードを書くと想定し、Object.prototype誰かが盲目的に を使用したい場合に備えて変更を禁止することfor...inです。この点を気にする場合、または (IMO では壊れた) 問題のあるコードを使用している場合は、少し異なるバージョンを試してください。

function can(obj, methodName)
{
     return ((typeof obj[methodName]) == "function");
}

if (can(someObject, "quack"))
{
    someObject.quack();
}

おすすめ記事