Javascript 为什么不在2017年将Array.prototype方法添加到NodeList.prototype上?
为什么(如果有的话)我应该避免这样做:Javascript 为什么不在2017年将Array.prototype方法添加到NodeList.prototype上?,javascript,dom,libraries,prototypal-inheritance,Javascript,Dom,Libraries,Prototypal Inheritance,为什么(如果有的话)我应该避免这样做: if (NodeList.prototype.map === undefined) { NodeList.prototype.map = Array.prototype.map } 或者来自的任何其他内容(我不是指[]。,我知道它很慢) 据我所知,这种行为在Prototype 1.0和Mootools时代很流行,被肆无忌惮地使用,但由于浏览器之间的不一致,很快就被贬低了 现在似乎很好用,尤其是对于这种保守的用法。我们还应该避开吗?因为,如果节点列
if (NodeList.prototype.map === undefined) {
NodeList.prototype.map = Array.prototype.map
}
或者来自的任何其他内容(我不是指[]。
,我知道它很慢)
据我所知,这种行为在Prototype 1.0和Mootools时代很流行,被肆无忌惮地使用,但由于浏览器之间的不一致,很快就被贬低了
现在似乎很好用,尤其是对于这种保守的用法。我们还应该避开吗?因为,如果
节点列表
获得标准的映射
方法,它将与您的方法冲突
即使您检查当前方法是否存在,例如,在指定替换之前检查原型是否持有未定义的
,编写web标准的人员也必须确保其更改不会破坏我们(即web作者)的工作代码。向后兼容性是开放web的核心原则之一;我们相信,如果我们今天编写代码并将其保留一周甚至几年,它应该仍然可以工作
原型和Mootools正是因为这个原因而成了问题;他们非常受欢迎,他们毫不犹豫地修改了他们认为合适的内置原型
有没有想过为什么字符串和数组上的.contains()
被命名为不太熟悉的.includes()
?哦,是的,通过定义一个不一致的实现
TL;DR:这可能对任何一个页面都不重要,但在一个流行的图书馆使用时,它可能会成为一个大问题,因此人们倾向于完全避免这种做法