javascript当中的代码嗅探扩展原生对象和原型(prototype)

 更新时间:2013年01月11日 09:37:27   投稿:whsnow  
如果不是有特殊需要而去扩展原生对象和原型(prototype)的做法是不好的,除非这样做是值得的,例如,向一些旧的浏览器中添加一些ECMAScript5中的方法

:翻译之中有什么不恰当的地方,欢迎大家指正,祝大家双节快乐!
如果不是有特殊需要而去扩展原生对象和原型(prototype)的做法是不好的

复制代码 代码如下:

//不要这样做
Array.prototype.map = function() {
// 一些代码
};

除非这样做是值得的,例如,向一些旧的浏览器中添加一些ECMAScript5中的方法。
在这种情况下,我们一般这样做:
复制代码 代码如下:

if (!Array.prototype.map) {
Array.prototype.map = function() {
//一些代码
};
}

如果我们比较偏执,为了防止别人将map定义为其它意想不到的值,像true或其他,我们可以 将检测代码改为下面这样:
复制代码 代码如下:

if (typeof Array.prototype.map !== "function") {
Array.prototype.map = function() {
// 一些代码
};
}

但是,在一个充满敌意和残酷竞争的环境下(换句话说,但你提供或者使用一个js库时),你不应该相信任何人。如果其他人的js代码先于你的js代码加载,并且以某种方式定义了一个不完全兼容ES5的map()方法,导致你的代码不能正常运行,该怎么办呢?

不过,你可以相信浏览器,如果Webkit内核实现了map()方法,你可以放心,这个方法肯定会正常运行。否则的话,你就要用你的代码进行检测了。

幸运的是,这在JavaScript当中很容易实现,当你调用原生函数的toString方法的时候,会返回一个函数的字符串,该函数的函数体是[native code]。
例如在Chrome的控制台下:

复制代码 代码如下:

> Array.prototype.map.toString();
"function map() { [native code] }"

一个适当的代码检查向来就是一个稍微令人不快的事,因为不同浏览器对空格和换行处理的太过轻率。测试如下:
复制代码 代码如下:

Array.prototype.map.toString().replace(/\s/g, '*');
// "*function*map()*{*****[native*code]*}*" // IE
// "function*map()*{*****[native*code]*}" // FF
// "function*map()*{*[native*code]*}" // Chrome

只简单的去掉\s会得到更实用的字符串:
复制代码 代码如下:

Array.prototype.map.toString().replace(/\s/g, '');
// "functionmap(){[nativecode]}"

你可以将它封装成一个可以重用的shim()函数,这样以来你就没有必要去重复所有的类似!

Array.prototype...这样的操作了。这个函数会接受一个对象作为参数(例如,Array.prototype),一个将要添加的属性(例如 'map')和一个要添加的函数。
复制代码 代码如下:

function shim(o, prop, fn) {
var nbody = "function" + prop + "(){[nativecode]}";
if (o.hasOwnProperty(prop) &&
o[prop].toString().replace(/\s/g, '') === nbody) {
//表名是原生的!
return true;
}
//新添加的
o[prop] = fn;
}

测试:
复制代码 代码如下:

//这是原生的方法
shim(
Array.prototype, 'map',
function(){/*...*/}
); // true
//这是新添加的方法
shim(
Array.prototype, 'mapzer',
function(){alert(this)}
);
[1,2,3].mapzer(); // alerts 1,2,3

(完)^_^

相关文章

  • 微信小程序商城项目之侧栏分类效果(1)

    微信小程序商城项目之侧栏分类效果(1)

    这篇文章主要为大家详细介绍了微信小程序实战商城系列之侧栏分类效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • JS二维数组的定义说明

    JS二维数组的定义说明

    本篇文章主要是对JS二维数组的定义进行了说明介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-03-03
  • JS实现常用导航鼠标下经过下方横线自动跟随效果

    JS实现常用导航鼠标下经过下方横线自动跟随效果

    这篇文章主要介绍了JS写常用导航鼠标下经过下方横线自动跟随效果,文中还给大家讲解了基于css + js 实现导航栏下划线跟随鼠标滑动效果,需要的朋友可以参考下
    2023-01-01
  • 详细谈谈JavaScript中循环之间的差异

    详细谈谈JavaScript中循环之间的差异

    JS循环语句也叫迭代语句,是一种特殊的语句,主要用于需要多次执行的代码块,下面这篇文章主要给大家介绍了关于JavaScript中循环之间的差异的相关资料,需要的朋友可以参考下
    2021-08-08
  • js打字机效果代码

    js打字机效果代码

    大家经常用js实现打字机效果,最近发现这个不错
    2008-06-06
  • 刷新页面的几种方法小结(JS,ASP.NET)

    刷新页面的几种方法小结(JS,ASP.NET)

    本篇文章只要是对刷新页面的几种方法进行了详细的总结介绍,包括JS与ASP.NET。需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • RequireJS用法简单示例

    RequireJS用法简单示例

    这篇文章主要介绍了RequireJS用法,结合简单实例形式分析了RequireJS项目文件结构、相关操作技巧与注意事项,需要的朋友可以参考下
    2018-08-08
  • JavaScript数组塌陷实例解析

    JavaScript数组塌陷实例解析

    这篇文章主要为大家介绍了JavaScript数组塌陷实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • javascript回到顶部特效

    javascript回到顶部特效

    这篇文章主要为大家详细介绍了javascript回到顶部特效,具有一定的参考价值,感兴趣的朋友可以参考一下
    2016-07-07
  • 关于页面嵌入swf覆盖div层的问题的解决方法

    关于页面嵌入swf覆盖div层的问题的解决方法

    这篇文章主要介绍了关于页面嵌入swf覆盖div层的问题的解决方法,需要的朋友可以参考下
    2014-02-02

最新评论