ホームページ ウェブフロントエンド jsチュートリアル js のよりエレガントな互換性_javascript スキル

js のよりエレガントな互換性_javascript スキル

May 16, 2016 pm 06:21 PM
互換性がある

基礎となるインターフェイスに互換性を持たせるにはさまざまな問題がありますが、これはクライアントがサポートするインターフェイスを決定するために if を使用することに他なりません。最も有名な例はイベントです:

コードをコピー コードは次のとおりです:

var addEvent = function( e, what, how) {
if (e.addEventListener) e.addEventListener(what, how, false)
else if (e.attachEvent) e.attachEvent('on' what, how )
}

ここでは、イベントを要素にバインドするときに発生する可能性のある 2 つの状況、つまり標準の W3C DOM インターフェイスと DHTML によって提供されるインターフェイスについて検討します。もちろん、この例はまだ未熟ですが、問題を説明するには十分です。

本来の方法は、互換性層で現場判定を呼び出し、対応するif分岐に入る方法です。明らかに、この「その場で判断する」方法は効率的ではありません。その後、人々はこの方法を採用しました:
コードをコピー コードは次のとおりです:

if ( MSIE) {
addEvent = function(e, what, how) {
e.attachEvent('on' what, how)
}
} else {
addEvent = function(e , what , how) {
e.addEventListener(what, how);
}
}

1 回の判断後に異なるコードを addEvent にバインドすることで、実行する必要がなくなります。時間分岐判定。

残念ながら、この問題は簡単ではありません。まず第一に、「attachEvent を使用する」と「クライアントは MSIE である」をバインドするのは非常に時代遅れの考えです。いつか Microsoft の良心がそれを知ったらどうなるでしょうか?これは現在起こっています。IE9 は明らかに DOM インターフェイスをサポートしており、DOM3 でさえそれをサポートしています。その結果、この「良心の発見」の動きによって多くのフロントエンド ライブラリが壊れ、コードの変更を余儀なくされることになります (IE8 が登場したときと同じように)。さらに、このアプローチでは「不明なクライアント」が考慮されていません。私の知る限り、Google が Chrome をリリースした後、多くのクラス ライブラリのコードが書き直されました。

特徴検出を行うにはどうすればよいですか?機能検出により、「新しいクライアント」によって引き起こされるトラブルを最小限に抑えることができます。クラス ライブラリの初期化時に定義されたコードのセットを通じてクライアントの機能を検出し、この検出値のセットを使用してクラス ライブラリ コードをバインドします。
コードをコピー コードは次のとおりです。

var supportAddEventListener = !!(checkerElement.addEventListener);
if (supportsAddEventListener) {
addEvent = function(e, what, how) {
e.addEventListener(what, how);
}
} else if (supportsAttachEvent) {
addEvent = function(e, what, how) {
e.attachEvent('on' what, how);
}
}

特徴検出は実際には分離です "特定のクライアントを使用する」および「特定の機能をサポートする」 - if ブランチに「機能が存在するかどうか」(インターフェイスが一貫しているかどうか) を直接判断させることで、クライアントの「良心の発見」によって引き起こされる「善意」を排除します。取引先のメーカーが悪いことをする。」実際、これは歴史的な傾向とも一致しています。標準インターフェイスが徐々に普及し、クライアントの「表現が一貫している」ようになったら、一貫した互換性レイヤー インターフェイスを作成しないのはなぜでしょうか。

ドロップ もう一度コードを見てみましょう。通常、互換性のために機能検出を使用するコードは次のようになります:
コードをコピー コードは次のとおりです:

if (new_interface_detected) {
comp = function() {uses_new_interface};
} else if (old_interface_detected) {
comp = function() {uses_old_interface}; } else {
throw new Error('Unadaptable!')
}


つまり、プロセスは次のとおりです。

クライアントが新しいインターフェイスをサポートしている場合は、互換性レイヤーを新しいインターフェイスにバインドします
それ以外の場合、クライアントが古いインターフェイス/一貫性のないインターフェイスをサポートしている場合は、バインドします互換性レイヤーを新しいインターフェイスにバインドします。 古いインターフェイスにバインドします。
それ以外の場合は、可能であれば、エラー フィードバックを返します。
つまり、クライアントが「高度な」機能 (新しいもの) をサポートしている場合、互換性レイヤー プログラムは高高度から「落ちます」。インターフェイス、標準インターフェイス)、それを「キャッチ」するだけです - 互換性レイヤーにホームがあります。そうでない場合は、落ち続けます - 古いインターフェイスがそれをキャッチした場合、誰もそれをキャッチしない場合は、古いインターフェイスを使用します。彼は地面に倒れ込み、息を引き取りながらこう叫びました。「あなたが使っているクライアントはニッチすぎる、私には何もできません!」

これは何に似ていますか?実際、JavaScript オブジェクト システムのメカニズムを理解していれば、次のように類推できます。「これは単なるプロトタイプではないでしょうか?」プロトタイプ システムはこのドロップを利用します。特定のメンバーを探し、それがこのオブジェクトに定義されている場合はそれを返し、そうでない場合はプロトタイプ チェーンに沿って上方向に検索し (はい、今回は上方向です)、以下同様です。プロトタイプ チェーンが実際に最後に到達すると、unknown が返されます。

とにかくやってみよう!ここでも例として addEvent を使用します。まず、何も含まれていない空のドライバーを定義します。

var nullDriver = {} 次に、オブジェクトを作成し、プロトタイプ チェーンがそれを指すようにします。 ECMA V5 時代では、Object.create を使用できますが、古いクライアントがまだたくさんあるため (それ以外は互換性があります)、独自の関数を作成します:
コードをコピーします コードは次のとおりです。

varderive = Object.create ? Object.create: function() {
var T = function() {} ;
return function(obj) {
T.prototype = obj;
return new T
}
}()

この使い方は奇妙ですが、問題なく動作し、遅くはありません - Object.create の約半分の速さです。この派生を使用して開始します:
コードをコピー コードは次のとおりです:

var dhtmlDriver = detect(nullDriver);
var dhtmlDriverBugfix = 派生(dhtmlDriver); ここでのバグ修正は、いくつかの「バグ」および特殊な状況のために定義された特別なドライバーです。ここでは無視して構いません。さて、DHTML の addEvent とは何ですか?

if (supportsAttachEvent) {
dhtmlDriver.addEvent = function(e, what, how) {
e.attachEvent('on' what, how)
}
}

それでは?プロトタイプ チェーンの先頭にあるドライバーは W3C 標準ドライバーであるはずです。それを書き留めてください。
コードをコピーします コードは次のとおりです。 🎜>var w3cDriverBugfix =derive(w3cDriver);
if (supportsAddEventListener) {
w3cDriver.addEvent = function(e, what, how) {
e.addEventListener(what, how)
}
}


最後に、最終的な呼び出しインターフェイスを作成するために何かを配置します。 (w3cDriverBugfix が醜すぎるため...)



コードをコピー
コードは次のとおりです: var driver =derive (w3cDriverBugfix);
その後呼び出されます。これにより、フォールバックの本質を失うことなく、これらの怖そうな分岐判断がシンプルかつ効果的になります。addEventListener をサポートするクライアントで addEvent を呼び出すことは、w3cDriver.addEvent を呼び出すことと同等であり、これをサポートするクライアントでは最後に落ちます。次に、たとえば dhtmlDriver.addEvent を呼び出します。さらに、バグ修正を簡単に実行できます。元のレイヤーにはまったく影響を与えずに、専用の「バグ修正」レイヤーをフックできます。

待って、これほど多くのレイヤーを継承すると遅くなりますか?確かに、これほど奥深いプロトタイプチェーンは間違いなく遅くなりますが、私には方法があります。オブジェクトのプロパティに書き込むと何が起こるかを覚えていますか?




コードをコピー
コードは次のとおりです。 var ego = function(x) {return x} for (ドライバー内のそれぞれの変数) {
if (! (nullDriver 内のそれぞれ)) {
ドライバー[それぞれ] = ego(ドライバー[それぞれ])
}
}


はい、元々プロトタイプチェーンで上位にあったメソッドは、突然最下位に落ちてしまいます。今回は、プロトタイプ チェーンを検索する必要はなく、プロパティを最後から直接取得するだけです。ここで ego 関数を使用する理由は、一部のブラウザーがここでコードを「最適化」できないようにするためです。

まとめ ここでは互換性について話しますが、その本質は言語機能にあります。プロトタイプの継承を使用すると、この面倒な操作を非常にエレガントに完了できます。はい、フレームの美しさは外側だけでなく、内側も、たとえ最も煩わしいものであっても、同様にエレガントでなければなりません。

ここでのテクノロジーはdessにあります。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Win10 の最も安定したバージョン Win10 の最も安定したバージョン Dec 25, 2023 pm 07:58 PM

多くのユーザーは、コンピューターの操作中にフリーズやブルー スクリーンに遭遇することがありますが、現時点では、最も安定して動作する Win10 バージョンを見つける必要があります。全体的に非常に使いやすく、毎日の使用がスムーズになります。史上最も安定したWin10バージョン 1. Win10純正のオリジナルシステム. ユーザーは簡単な操作を使用できます. システムは最適化されており、強力な安定性、セキュリティと互換性を備えています. ユーザーは手順に従って完璧なマシンを達成できます. 2. ロシアのマスター合理化 win10 のバージョンは厳密に合理化され、多くの不要な機能やサービスが削除されました。合理化後は、システムの CPU とメモリの使用量が減り、動作が速くなります。 3. Win10 Lite Edition 1909 は、異なるハードウェア モデルの複数のコンピューターにインストールされています。

Switch2はSwitchカートリッジと互換性がありますか? Switch2はSwitchカートリッジと互換性がありますか? Jan 28, 2024 am 09:06 AM

Switch2はGamescom 2023で任天堂から発表された新モデルですが、一部のプレイヤーは新モデルと以前のバージョンのカートリッジの間に互換性の問題があるのではないかと心配しています。 switch2 はスイッチ カセットと互換性がありますか? 回答: switch2 はスイッチ カセットと互換性がありません。 Switch 2 カートリッジの紹介 任天堂の生産チェーン会社からの情報によると、Switch 2 は 64GB カートリッジを使用する可能性があります。パフォーマンスが向上し、より多くの 3A ゲームの名作をサポートするため、より大きなカートリッジ容量が必要になります。なぜなら、多くのゲーム作品は、ゲームカートリッジに詰める前に去勢して圧縮する必要があるからです。さらに、Switch のカートリッジはゲーム コンテンツをコピーする傾向があるため、新しいカートリッジに交換してください。

Win11はダイナミック壁紙をサポートしていますか? Win11はダイナミック壁紙をサポートしていますか? Jan 01, 2024 pm 06:41 PM

ご存知のとおり、win11 の主な機能は独自の Android サブシステムであり、エミュレータを使用せずに Android ソフトウェアをインストールできますが、win11 Android アプリケーションの遅延の問題もあります。 win11 はダイナミック壁紙に対応していませんか? 回答: Win11 はダイナミック壁紙に対応していますが、使用できない場合は、ソフトウェアまたはシステムのバージョンが遅れている可能性があります。更新されたばかりの場合は、システムの壁紙で覆われている可能性があります。 1. システムまたはソフトウェアのバージョンが遅れている場合は、システムとダイナミック壁紙ソフトウェアを更新してください。 2. システムの壁紙で覆われている場合は、「設定」を開いてみてください。 3. 次に、「個人用設定」で「背景」設定を入力します。 4. 次に、パーソナライズされた背景を「写真」に変更します。 5. 変更が完了したら、通常どおりダイナミック壁紙を設定できます。

Linux システムは Android ソフトウェアと互換性がありますか? Linux システムは Android ソフトウェアと互換性がありますか? Mar 20, 2024 pm 02:27 PM

近年、モバイル機器分野におけるAndroidシステムの普及が急速に進んでおり、Androidアプリケーションが他のプラットフォームでも動作するかどうかに多くの人が注目し始めています。 Linux は一般的なオペレーティング システムとして多くの人に好まれていますが、問題は、Linux システムは Android ソフトウェアと互換性があるのか​​ということです。まず明確にしておきたいのは、Linux システムと Android システムはカーネルに類似点があるということです。どちらも Linux カーネルをベースにしたオペレーティング システムです。したがって、理論的には、Linux システムは実行できます。

d3dx9_43.dll の非互換性を解決する方法 d3dx9_43.dll の非互換性を解決する方法 Feb 24, 2024 pm 10:06 PM

d3dx9_43.dll の非互換性を解決する方法. 近年、コンピューターやゲームの急速な発展により、私たちはより多くのエンターテイメントと利便性を享受できるようになりました。ただし、特定のプログラムをインストールまたは実行すると、「d3dx9_43.dll には互換性がありません」などのエラー メッセージが表示されることがあります。この場合、どうやってこの問題を解決すればよいのでしょうか?まず、このエラー メッセージの意味を理解しましょう。 d3dx9_43.dll は、オペレーティング システムで使用される DirectX のシステム ファイルです。

win7と互換性のあるwin10の設定方法の紹介 win7と互換性のあるwin10の設定方法の紹介 Jan 03, 2024 pm 05:09 PM

多くの友人が未だに win10 システムではなく win7 システムを選択している理由は、互換性の悪さを恐れているからです。実はwin10でもwin7の互換モードを設定できるようになりましたので、プロパティで設定を変更するだけでOKですので、一緒に見ていきましょう。 win10 を win71 と互換性を持たせるにはどうすればよいですか? まず、win7 システムで実行する必要があるプログラムを右クリックし、「プロパティ」2 を開き、上の「互換性」をクリックして互換性タブに入ります。 3. 互換モードで「互換モードでこのプログラムを実行する」にチェックを入れます。 4. 次に、下のドロップダウン メニューから「Windows 7」を選択します。 5. 完了したら、「適用」をクリックするか、「OK」をクリックします。

Eclipse バージョンの非互換性に対処する方法 Eclipse バージョンの非互換性に対処する方法 Jan 04, 2024 am 10:29 AM

互換性のないバージョンの Eclipse が見つかった場合はどうすればよいですか? [はじめに] Eclipse は、人気のある開発ツールとして、強力な機能と豊富なプラグインを提供するだけでなく、クロスプラットフォーム機能も備えています。ただし、Eclipse を使用すると、バージョンの非互換性の問題が発生し、プログラムが適切に実行されなかったり、コンパイル エラーが発生したりすることがあります。この記事では、Eclipse バージョンの非互換性に対処する方法を説明し、一般的な互換性の問題を解決するためのコード例をいくつか示します。 【解決策】Eclをアップデートする

Win11 で互換性のあるネットワーク ポイントをインストールおよび構成するための詳細ガイド Win11 で互換性のあるネットワーク ポイントをインストールおよび構成するための詳細ガイド Jan 09, 2024 pm 02:50 PM

閲覧するときに古いバージョンのブラウザを使用する必要がある Web サイト ユーザーが多く、新しいバージョンを使用するには互換性のあるアウトレットを追加する必要があるため、今日は win11 で互換性のあるアウトレットを追加するための詳細なチュートリアルをお届けします。そして学びなさい。 win11 で互換性のあるコンセントを追加する方法 1. まずシステムで IE ブラウザを開き、ブラウザの右上隅にある小さな歯車をクリックして「設定」に入ります。 2. 次に、開いた設定メニューで「互換表示設定」を開きます。 3. 「この Web サイトを追加する」の編集ボックスに追加する URL を入力し、「追加」をクリックします。 4. 最後に、追加した URL のドメイン名が下に表示されます。ウィンドウを閉じると、直接アクセスできます。

See all articles