JavaScript内置对象中定义了大量函数。例如,String
有slice()
,split()
和Array
有join()
,只需使用
Array.prototype.join = 'test'
,然后所有数组都将丢失join()
方法
但是,作为开源项目的开发者,我们应该以何种方式查看原型的这种潜在变化?它将成为一个问题,因为我们很可能会或多或少地使用这些功能来实现某些功能。
在jQuery中,它会保留一些方法的副本:
var class2type = {};
var toString = class2type.toString;
var hasOwn = class2type.hasOwnProperty;
但是只有一些方法是安全的,如果你仔细阅读jQuery的源代码,你会注意到在String对象上直接调用了一些String
方法。
当然,我们总是可以保留内置JavaScript对象的所有方法的副本,但它非常混乱。实际上,它也成为执行时间的问题。如果程序在原型更改之前执行,那么它就没问题了。但如果相反,它将会失败。所以我更感兴趣的是,当jQuery或其他库决定保留一些方法的副本时,他们的决定背后的哲学是什么?
谢谢。
答案 0 :(得分:2)
作为开源项目的开发人员,最安全和最好的做法是假装内置原型被冻结。扩展或修改它们的做法导致的问题远远超过解决方案。
如果你需要一个自定义的join
函数,只需创建它就可以将一个字符串作为第一个参数。
function join(string, separator) {
// ...
}
这可以保持原型的清洁,并使您不必担心对覆盖方法的引用。
你在jQuery示例中看到的只是别名。这些方法被分配给变量以使其更易于使用。
没有办法对此进行防御性编码,因为当jQuery加载另一个脚本时,可能已经修改了内置原型并且原始引用将丢失。