And*_*kin 56 javascript prototype coding-style
谷歌JavaScript风格指南建议不要扩展Array.prototype
.但是,我Array.prototype.filter = Array.prototype.filter || function(...) {...}
在浏览器中使用它(和类似方法)的方式不存在.MDN实际上提供了类似的例子.
我知道Object.prototype
问题,但Array
不是哈希表.
扩展时会出现什么问题,这会让Array.prototype
Google提出反对意见?
Jam*_*son 78
大多数人都错过了这一点.在我看来,填充或填充标准功能,Array.prototype.filter
以便它在旧浏览器中工作是一个好主意.不要听仇恨.Mozilla甚至会向您展示如何在MDN上执行此操作.通常,不扩展Array.prototype
或其他原生原型的建议可能归结为以下之一:
for..in
可能无法正常工作以下是我的回复:
for..in
在Array上使用.如果你这样做,你可以hasOwnProperty
用来确保它是合法的.Array.prototype.filter
.Object.keys
到IE7.它似乎在某些情况下停止工作.你的旅费可能会改变.看看这些参考文献:
祝好运!
我将从Nicholas Zakas的优秀文章中给出关键句子的要点.可维护的JavaScript:不要修改你不拥有的对象:
基本上,不要这样做.即使您的项目永远不会被其他任何人使用,并且您永远不会导入第三方代码,也不要这样做.你会建立一种可怕的习惯,当你开始尝试与他人玩耍时,这种习惯很难打破.
作为Jamund Ferguson答案的现代更新:
通常,不扩展Array.prototype或其他本机原型的建议可能归结为以下一种:
- for..in可能无法正常工作
- 其他人可能也想使用相同的函数名称扩展Array
- 即使使用填充程序,它也可能无法在所有浏览器中正常工作。
现在可以在ES6中通过使用符号添加方法来减轻第1点和第2点的压力。
它使调用结构变得更加笨拙,但是添加了一个不会被迭代且无法轻易复制的属性。
// Any string works but a namespace may make library code easier to debug.
var myMethod = Symbol('MyNamespace::myMethod');
Array.prototype[ myMethod ] = function(){ /* ... */ };
var arr = [];
// slightly clumsier call syntax
arr[myMethod]();
// Also works for objects
Object.prototype[ myMethod ] = function(){ /* ... */ };
Run Code Online (Sandbox Code Playgroud)
优点:
缺点:
归档时间: |
|
查看次数: |
25221 次 |
最近记录: |