javascript 判断函数是否原生支持

看YUI源代码的时候,注意到yui-lang.js中有一个_isNative()函数,用来判断javascript是否原生某些函数。代码如下:

var L = Y.Lang || (Y.Lang = {}),
NATIVE_FN_REGEX = /\{\s*\[(?:native code|function)\]\s*\}/i;
@method _isNative
@param {Function} fn Function to test.
@return {Boolean} `true` if _fn_ appears to be native, `false` otherwise.
@static
@protected
@since 3.5.0
**/
L._isNative = function (fn) {
    return !!(Y.config.useNativeES5 && fn && NATIVE_FN_REGEX.test(fn));
};

使用:var isSupportObjectCreate=Lang._isNative(Object.create);

剥离出来是这样:

// detect native method in object
// not same scope of isHostObject
var isNative = function(object, method) {
  return object && method in object &&
    typeof object[method] != 'string' &&
    (/{s*[native code]s*}|^[function]$/).test(object[method]);
}

说明:对于object[method](实际为函数的toString()结果),若为原生方法,IE和W3C浏览器返回[native code], 而Safari<= 2.0.4返回 [function]。

在YUI代码注释里还提到该方法并不完全准确,kangax在他的文章 http://perfectionkills.com/detecting-built-in-host-methods/ 中有详细的说明。

该函数并不能真正检测到函数是否真为原生支持的,因为在代码中我们可以返回’[function]‘来欺骗它。

window.test = {
  toString: function() {
    return '[function]';
  }
};
isNative(window, 'test'); // true

尽管如此,这种方式依然是目前最为可靠的检测方式。

更多内容参考:http://perfectionkills.com/detecting-built-in-host-methods/

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>