gpt4 book ai didi

javascript - 扩展类或创建新函数,哪个更好?

转载 作者:行者123 更新时间:2023-11-28 20:47:03 25 4
gpt4 key购买 nike

如果有人想为旧浏览器实现一个功能(例如 Array.prototype.filter ),哪种方法更好?为什么?各有什么优缺点?

if (!Array.prototype.filter) {
Array.prototype.filter = function() {
//implementation
}
}

function myFilter(e,i,f) {
if (!Array.prototype.filter) {
//implementation
} else {
return Array.prototype.filter(e,i,f);
}
}

最佳答案

就我个人而言,我大多数时候都使用第一种方法(添加Array.prototype.filter),但有时我不这样做。在为旧浏览器编写大型框架时,我不使用第一种方法,因为它需要与互联网上的任何其他脚本(包括糟糕的脚本)很好地配合。

以下是需要考虑的事项。假设您使用您描述的方法在 Array.prototype.filter 中进行填充,然后将第 3 方脚本添加到您的网站,该脚本执行如下操作:

var someArray = [ 'a', 'b', 'c' ];
console.log('The first three letters of the alphabet are: ');
for (var i in someArray)
console.log(someArray[i]);

结果?

The first three letters of the alphabet are: 
a
b
c
function () { ... }

您的过滤函数已打印出来!现在,在技术层面上,没有人应该使用 for...in 循环迭代数组,但您无法控制第 3 方脚本可能执行的操作。这是主要缺点,当您编写要在整个互联网上使用的大型库时,值得考虑。

这会阻止您向 Object.prototype 添加任何内容(使用简单的 Object.prototype.method = function() { ... } 赋值),因为for...in很适合用于其他类型的对象,而这种填充会破坏for...in`。

但是,如果您只是编写要在自己的网站上使用的代码,并且您知道要包含的脚本质量很高并且不会犯这样的错误,那么这是一项很好的技术。

此外,如果您的代码仅适用于兼容 ECMAScript 5 的浏览器,您可以将垫片定义为不可枚举,这将防止它们出现在 for...in 循环中。我目前正在开发一个项目,将 ECMAScript 6 方法填充到 ES5 浏览器,由于它只打算在 ES5 浏览器中运行,所以我可以摆脱:

Object.defineProperty(Array.prototype, 'contains', {
value: function(value) {
// Implementation
},
enumerable: false,
writable: true,
configurable: true
});

以这种方式定义垫片可以防止它出现在 for...in 循环中,因此在 Object.prototype 上使用它甚至是安全的,只要您的实现准确遵循规范/草案

这就引出了第二点。如果您没有信心能够按照规范准确地实现该方法,那么您最好不要填充它。这可能会破坏检查内置函数并使用它(如果可用)的库,但会回退到某些内容否则,如果不是。最好让他们什么都不做,而不是让他们有一个损坏的实现。

正是由于这个原因,我从不尝试部分实现垫片。例如,Object.create 无法在 ES3 浏览器中完全实现,因此我永远不会对此进行填充。我只是使用我自己的 myLibrary.create 函数,它的功能可能类似,但至少任何可能检查 Object.create 是否存在的代码都不会被误导相信它有一个完整的、工作的版本。

这个故事的寓意:如果您要使用 shim,请在 MDN 上查看一些非常出色的、符合规范的 shim,并学习编写类似的代码:Array.prototype.filter

<小时/>

最后一点:许多库不在 Array.prototype 上的方法中填充的原因可能部分是出于其中的一些考虑,但在许多情况下也有历史原因。像 jQuery 这样的库是在 filter 成为标准内置方法之前开发的。 Prototype.js 采用了添加非标准方法的方法,这比上面讨论的缺点更多。 jQuery 决定不在内置原型(prototype)中添加非标准方法,这就是为什么它们有 $.filter

关于javascript - 扩展类或创建新函数,哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13274654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com