我们应该始终保留JavaScript内置对象方法的副本吗?

时间:2016-05-16 09:46:31

标签: javascript jquery

JavaScript内置对象中定义了大量函数。例如,Stringslice()split()Arrayjoin(),只需使用

Array.prototype.join = 'test',然后所有数组都将丢失join()方法

但是,作为开源项目的开发者,我们应该以何种方式查看原型的这种潜在变化?它将成为一个问题,因为我们很可能会或多或少地使用这些功能来实现某些功能。

在jQuery中,它会保留一些方法的副本:

var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty;

但是只有一些方法是安全的,如果你仔细阅读jQuery的源代码,你会注意到在String对象上直接调用了一些String方法。

当然,我们总是可以保留内置JavaScript对象的所有方法的副本,但它非常混乱。实际上,它也成为执行时间的问题。如果程序在原型更改之前执行,那么它就没问题了。但如果相反,它将会失败。所以我更感兴趣的是,当jQuery或其他库决定保留一些方法的副本时,他们的决定背后的哲学是什么?

谢谢。

1 个答案:

答案 0 :(得分:2)

作为开源项目的开发人员,最安全和最好的做法是假装内置原型被冻结。扩展或修改它们的做法导致的问题远远超过解决方案。

如果你需要一个自定义的join函数,只需创建它就可以将一个字符串作为第一个参数。

function join(string, separator) {
  // ... 
}

这可以保持原型的清洁,并使您不必担心对覆盖方法的引用。

你在jQuery示例中看到的只是别名。这些方法被分配给变量以使其更易于使用。

没有办法对此进行防御性编码,因为当jQuery加载另一个脚本时,可能已经修改了内置原型并且原始引用将丢失。