2

jQueryでは、次のような関数を呼び出すことができます。

$("id").someFunction();

jQueryのコードベースを見ると、を使用し$て作成されているオブジェクトのプロトタイプが変更され、を介して追加された関数が返されるように見え.fnます。私のアプリケーションでは、jQueryを必要とせずに同じ構文のみが必要です。

この種の動作の別の例は、次のようなJavascriptの組み込みメソッドの一部です。 .replace、、、など。リストされているメソッドの一部はString.prototypeオブジェクトにあり、組み込みオブジェクトを拡張することは悪い習慣です(したがって、聞く)。.toLowerCase.split.toString

割り当てられるすべての「文字列」または「オブジェクト」のプロトタイプに関数を追加するにはどうすればよいですか。私がこれを行っている理由は、ifステートメントを常に実行することなく、イベントをアタッチするクロスブラウザー実装を作成しようとしているためです。

したがって、移動する必要はありません。if(el.addEventListener)またはif()のいずれかel.attachEventを実行できるようにel.bindEventしたいのですが、イベントバインディングなどのすべてのチェックを実行する、舞台裏のプロトタイプメソッドになります。

プロトタイプメソッドの割り当てに関する私の高度なJSの知識はそれほど素晴らしいものではないので、私が言ったことを理解して修正するためのあなたの助けに感謝します。

4

2 に答える 2

4

DOM要素のプロトタイプを拡張することは、組み込みオブジェクトを拡張することよりもさらに悪い考えです†</sup>。「DOMの拡張の何が問題になっているのか」という記事をご覧ください。

jQueryが提供するのは、DOMAPIの単純なラッパーです。これは問題ありません。DOMの拡張に関する問題は、

  • これらはホストオブジェクトであり、ECMAScript仕様でオブジェクトが定義されている方法とは異なる動作をする可能性があります。
  • 古いバージョンのIEは、DOMノードのプロトタイプさえ公開していません。

私がこれを行っている理由は、ifステートメントを常に実行することなく、イベントをアタッチするクロスブラウザー実装を作成しようとしているためです。

これだけでは、DOMを拡張する理由はありません。イベントハンドラーをバインドする独自の関数を定義でき、ページの読み込み時に1回だけ存在するかどうaddEventListenerかをテストする必要があります。このような関数は次のようになります。attachEvent

var bindEvent = (function() {
    if (document.addEventListener) {
        return function(element, event, handler) {
            element.addEventListener(event, handler, false);
        };
    }
    else {
        return function(element, event, handler) {
            element.attachEvent("on" + event, function() {
                handler.call(element, window.event);
            }
        };
    }
}());

このような関数には多くの正規化を入れることができます。たとえば、を使用する場合attachEvent、は、とは異なり、this通常、ハンドラーがバインドされている要素を参照しません(参照します) 。また、ご存知かもしれませんが、イベントオブジェクトはIEのハンドラーに引数として渡されません。これらの問題は両方とも、次の行を通じて解決されています。windowaddEventListener

handler.call(element, window.event);

handler(欠点は、直接バインドしなかったため、ハンドラーを単純に削除できないことですが、これらの問題も解決できます)。

これらのブラウザの違いなどの詳細については、quirksmode.orgの優れた記事を参照してください


†:ブラウザが提供するObject.definePropertyため、プロパティを列挙不可としてマークする可能性があるため、組み込みオブジェクトの拡張はそれほど悪くはありませんが、ライブラリがこれを使用し始めると、名前の衝突、メソッドのオーバーライド、および非互換性の可能性が高くなります。
あなた自身のコードのためにそれは大丈夫であるはずです。DOMオブジェクトは引き続きタブである必要があります。

于 2013-02-26T02:00:29.423 に答える
0

私が正しく理解していれば、組み込みのjavascriptオブジェクトにメソッドを追加する方法を知りたいので、次のようにします。

myObject.prototype.myMethod = function() {
  // whatever
}

したがって、例として:

String.prototype.splice = function() {
// splice function for every string
}
于 2013-02-25T22:57:35.873 に答える