我们是否应该始终保留JavaScript内置对象的副本';什么方法?

我们是否应该始终保留JavaScript内置对象的副本';什么方法?,javascript,jquery,Javascript,Jquery,JavaScript内置对象中定义了大量函数。例如Stringhasslice(),split()和Arrayhasjoin(),只需使用 Array.prototype.join='test',则所有数组都将丢失join()方法 然而,作为一个开源项目的开发人员,我们应该以什么方式来看待原型的潜在变化?这将成为一个问题,因为我们很可能或多或少地使用这些功能来实现某些功能 在jQuery中,它将保留其中一些方法的副本: var class2type={}; var-toString=class2

JavaScript内置对象中定义了大量函数。例如
String
has
slice()
split()
Array
has
join()
,只需使用

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

然而,作为一个开源项目的开发人员,我们应该以什么方式来看待原型的潜在变化?这将成为一个问题,因为我们很可能或多或少地使用这些功能来实现某些功能

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

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

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

当然,我们总是可以保留一个内置JavaScript对象的所有方法的副本,但它太乱了。事实上,它也成为了执行时间的问题。如果程序是在原型更改之前执行的,那么就可以了。但反之亦然,它将失败。因此,我更感兴趣的是,当jQuery或其他库决定保留某些方法的副本时,他们的决策背后的理念是什么


谢谢。

作为开源项目的开发人员,最安全、最好的做法是假装内置原型已经冻结。扩展或修改它们的做法造成的问题远远多于解决方案

如果需要自定义的
join
函数,只需创建它,使其以字符串作为第一个参数

function join(string, separator) {
  // ... 
}
这可以保持原型的干净,并且不必担心被覆盖方法的引用

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


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

作为开源项目的开发人员,最安全、最好的做法是假装内置原型已冻结。扩展或修改它们的做法造成的问题远远多于解决方案

如果需要自定义的
join
函数,只需创建它,使其以字符串作为第一个参数

function join(string, separator) {
  // ... 
}
这可以保持原型的干净,并且不必担心被覆盖方法的引用

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


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

可能重复为什么需要干扰原型本身。还有其他几种方法。在这样设置之前进行检查不是更好吗?如果我想和合作的程序员开个玩笑,我只会覆盖原始原型。让我澄清一下,我最初的想法不是讨论原型是好是坏。但作为一名开发人员,我更感兴趣的是,我开发的软件可能会被许多其他方使用,我不确定其他人是如何开发他们的程序的。所以也许(尽管我相信这是非常罕见的)他们会改变原型。那我该怎么处理呢?在jQuery的情况下,他们会保留一些方法,但不是全部,为什么他们会这样做?我相信jQuery保留方法的实例更多的是为了提高效率,而不是为了任何事情。可能重复为什么你需要干扰原型。还有其他几种方法。在这样设置之前进行检查不是更好吗?如果我想和合作的程序员开个玩笑,我只会覆盖原始原型。让我澄清一下,我最初的想法不是讨论原型是好是坏。但作为一名开发人员,我更感兴趣的是,我开发的软件可能会被许多其他方使用,我不确定其他人是如何开发他们的程序的。所以也许(尽管我相信这是非常罕见的)他们会改变原型。那我该怎么处理呢?在jQuery的情况下,他们会保留一些方法,但不是全部,为什么他们会这样做?我相信jQuery保留方法的实例更多的是为了提高效率。这是有道理的。只需添加一些附加信息,一开始可能会让人困惑(至少让我困惑)调用
a.concat(b,c)
concat.call(a,b,c)
更容易,那么为什么要麻烦呢?但是我已经研究了jQuery中的源代码,当需要调用
concat.apply(a,arrayOfValues)
时,它们通常使用
concat
和其他方法。如果没有别名,它将变成一个有意义的长语句
Arrray.prototype.concat.apply(a,arrrayOfValues)
。只需添加一些附加信息,一开始可能会让人困惑(至少让我困惑)调用
a.concat(b,c)
concat.call(a,b,c)
更容易,那么为什么要麻烦呢?但是我已经研究了jQuery中的源代码,当需要调用
concat.apply(a,arrayOfValues)
时,它们通常使用
concat
和其他方法。如果没有别名,它将变成一个长语句
Arrray.prototype.concat.apply(a,arrrayOfValues)