当前位置:  开发笔记 > 编程语言 > 正文

在WebKit中使用本机代码函数作为JavaScript对象

如何解决《在WebKit中使用本机代码函数作为JavaScript对象》经验,为你挑选了1个好方法。

我无法在基于WebKit的浏览器中将本机代码函数用作JavaScript对象.是不是可以直接别名这些功能?

这是最容易通过示例解释的,所以这是我在Developer Tools控制台中运行的内容:

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中使用jQuery Lint时出现了这个问题; 如果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); }
    }
}

bobince.. 7

您不能使用JavaScript 替换任何方法,无论是否是本机,WebKit.

当你说var _w = console.warn;,你正在剥离warn它的所有者对象console并将其视为一个独立的功能.当你调用它时,它没有this引用console它,所以它无法工作.

您可能会发现从绑定方法在其他语言中是如何工作的这种不寻常的,但是这是JavaScript的方法调用是如何设计:在this引用传递给基础功能完全对什么ownerowner.method()(或owner['method']()).如果在没有所有者的情况下单独调用该函数,则将该函数this设置为该window对象,并且该方法很可能会倒下.

要解决这个问题并传入一个正确的内容this,你必须使用method.call(或method.apply)显式地使用@slebetman描述,或者var _w= function() { console.warn.apply(console, arguments) };在ECMAScript第五版中使用类似or 的闭包创建自己的绑定函数method.bind(owner).



1> bobince..:

您不能使用JavaScript 替换任何方法,无论是否是本机,WebKit.

当你说var _w = console.warn;,你正在剥离warn它的所有者对象console并将其视为一个独立的功能.当你调用它时,它没有this引用console它,所以它无法工作.

您可能会发现从绑定方法在其他语言中是如何工作的这种不寻常的,但是这是JavaScript的方法调用是如何设计:在this引用传递给基础功能完全对什么ownerowner.method()(或owner['method']()).如果在没有所有者的情况下单独调用该函数,则将该函数this设置为该window对象,并且该方法很可能会倒下.

要解决这个问题并传入一个正确的内容this,你必须使用method.call(或method.apply)显式地使用@slebetman描述,或者var _w= function() { console.warn.apply(console, arguments) };在ECMAScript第五版中使用类似or 的闭包创建自己的绑定函数method.bind(owner).

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有