3

WebKitベースのブラウザでネイティブコード関数をJavaScriptオブジェクトとして使用できません。これらの関数を直接エイリアスすることは不可能ですか?

これは例で説明するのが最も簡単なので、DeveloperToolsコンソールで実行しているものは次のとおりです。

console.warn;
// Outputs:
// function warn() {
//     [native code]
// }

console.warn("console.warn");
// Outputs: "console.warn"

var _c = console;
_c.warn("_c.warn");
// Outputs: "_c.warn"

var _w = console.warn;
_w("_w");
// Outputs: "TypeError: Type error" on Safari/WebKit (Mac)
// Outputs: "TypeError: Illegal invocation" on Chrome (Mac)

var _w2 = function () { console.warn.apply(console, arguments); }
_w2("_w2");
// Outputs: "w2"

この問題は、SafariでjQueryLintを使用しようとしたときに発生しました。window.consoleが存在しない場合、破損を防ぐために次のアプローチを使用します。

_console = {
    warn: window.console && console.warn || function(){},
    ...
}

_console.warn("some error");

これが私の一時的な回避策です:

if((jQuery.browser.safari || jQuery.browser.webkit) && window.console) {
    jQuery.LINT.level = 3;
    jQuery.LINT.console = {
        warn: function() { console.warn.apply(console, arguments); },
        group: function() { console.group.apply(console, arguments); },
        groupEnd: function() { console.groupEnd(); },
        groupCollapsed: function() { console.group.apply(console, arguments); },
        log: function() { console.log.apply(console, arguments); }
    }
}
4

2 に答える 2

7

JavaScriptでは、ネイティブかどうか、WebKitかどうかに関係なく、メソッドのエイリアスを作成することはできません。

あなたが言うとき、あなたはその所有者オブジェクトからvar _w = console.warn;剥ぎ取り、それをスタンドアロン関数として扱っています。呼び出すと、への参照がないため、機能しません。warnconsolethisconsole

バインドされたメソッドが他の言語でどのように機能するかから、これは珍しいことに気付くかもしれませんが、それがJavaScriptメソッド呼び出しの設計方法です。参照は(または)thisにあるものだけに基づいて関数に渡されます。関数が所有者なしで単独で呼び出された場合、はオブジェクトに設定され、メソッドはフォールオーバーする可能性があります。ownerowner.method()owner['method']()thiswindow

これを回避して適切なを渡すには、 @ slebetmanで説明されているように明示的に(または)をthis使用するか、ECMAScriptFifthEditionのまたはのようなクロージャを使用して独自のバインド関数を作成する必要があります。method.callmethod.applyvar _w= function() { console.warn.apply(console, arguments) };method.bind(owner)

于 2010-01-19T00:00:51.390 に答える
2

それは次のようになります。

console.warn.apply(console,arguments);

適用する最初のパラメーターは、メソッドに渡すthisの値です。warn

于 2010-01-18T23:33:09.550 に答える