[解決済み] JavaScriptにはinterface型(Javaの'interface'など)はありますか?
質問内容
勉強中です
JavaScriptでOOPを作る方法
. インターフェイスの概念があるのか(Javaの
interface
)?
だから、リスナーを作ることができるようになるのですが......。
どのように解決するのですか?
なぜなら、"このクラスはこれらの関数を持たなければならない"という概念がない(つまり、インターフェース自体がない)。
- JavaScriptの継承は、クラスではなくオブジェクトをベースにしています。 そのことに気づくまでは、たいしたことではありません。
- JavaScriptは 極めて 適切なメソッドを持つオブジェクトを作成することができ、そのオブジェクトはインターフェースに適合することになります。 そして、それを適合させたすべてのものをアンデファインする。 . そうすると、型システムを覆すのはとても簡単で、たとえ偶発的なものであったとしても、型システムを覆すことはできません。-- 偶発的にでも!)型システムを破壊するのはとても簡単で、そもそも型システムを作ろうとすること自体に価値がないでしょう。
その代わり、JavaScriptでは ダックタイピング . (アヒルのように歩き、アヒルのように鳴けば、JSが気にする限り、それはアヒルです)。もし、あなたのオブジェクトが quack()、walk()、fly() メソッドを持っていれば、コードは、歩いたり、鳴いたり、飛んだりするオブジェクトを期待するところならどこでも、いくつかの "Duckable"インターフェースの実装を必要とせずにそれを使用することができます。インターフェイスとは、まさにコードが使用する関数のセット(およびその関数の戻り値)であり、ダックタイピングでは、それを無料で手に入れることができます。
さて、だからといって、もしあなたが
some_dog.quack()
TypeErrorが発生します。 率直に言って、もし犬に鳴けと言っているのなら、もう少し大きな問題があります。アヒルの型付けがうまくいくのは、いわばすべてのアヒルを一列に並べているときで、犬やアヒルを一般的な動物として扱わない限り混在させないようにしています。 言い換えれば、インターフェイスが流動的であっても、インターフェイスは存在します。そもそも、犬が鳴いたり飛んだりすることを期待するコードに犬を渡すのは、しばしばエラーになります。
しかし、もし自分が正しいと思っているのなら、特定のメソッドを使おうとする前にその存在をテストすることで、quacking-dogの問題を回避することができるのです。次のようなものです。
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については、中国以外ではもうむしろ関係ないので、触れません)。
もう一つの問題は、コーディングスタイルによっては、誰もが悪いコードを書くと思い込んでいて、そのために
Object.prototype
を盲目的に使おうとする人がいるかもしれないので
for...in
. それを気にする人、あるいは使っている人(IMO
ブロークン
) のコードでは、少し異なるバージョンを試してみてください。
function can(obj, methodName)
{
return ((typeof obj[methodName]) == "function");
}
if (can(someObject, "quack"))
{
someObject.quack();
}
関連
-
Vue+ElementUIによる大規模なフォームの処理例
-
vueはopenlayersを使用してスカイマップとガオードマップをロードする
-
[解決済み】JavaScriptでインラインIF文の書き方は?
-
JavaScriptのStringに関する共通メソッド
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] GUID / UUIDの作成方法
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] (a== 1 && a ==2 && a==3) が真に評価されることはあるのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
WeChatアプレット用ユニアプリによるグローバルシェアリング
-
Vueでルートネスティングを実装する例
-
vueにおけるfilterの適用シーンについて解説します。
-
Vueのイベント処理とイベントモディファイアの解説
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み】React Nativeアプリをターミナルから実行するとエラーが発生する(iOS)
-
[解決済み】ExpressJS - throw er Unhandled errorイベント
-
[解決済み】(Google Map API) Geocodeは以下の理由で成功しませんでした。REQUEST_DENIED
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
nodejs unhandledPromiseRejectionWarning メッセージ