Javascript 不改变js原型的原因有哪些?

Javascript 不改变js原型的原因有哪些?,javascript,prototype,primitive,Javascript,Prototype,Primitive,我经常使用某些算法,因此我正在考虑将它们添加到我的应用程序的原型中。例如,数组中的最后一个值array.last()与每次需要数组中的最后一个值时编写arr[arr.length-1]相比非常方便 我会在我的应用程序首次加载时执行此操作 Object.defineProperty(Array.prototype, 'last', { value: function(){return this[this.length -1]} }) 是否存在不这样做的功能原因 是的,不这样做是有原因的,一

我经常使用某些算法,因此我正在考虑将它们添加到我的应用程序的原型中。例如,数组中的最后一个值
array.last()
与每次需要数组中的最后一个值时编写
arr[arr.length-1]
相比非常方便

我会在我的应用程序首次加载时执行此操作

Object.defineProperty(Array.prototype, 'last', {
   value: function(){return this[this.length -1]} })

是否存在不这样做的功能原因

是的,不这样做是有原因的,一个立即跳出来的原因是,您将不可避免地与另一个库发生冲突,也认为调整内置原型更容易

考虑以下几点:

//my-cool-library.js
//返回数组中的最后一个值
Array.prototype.last=函数(){
返回此[this.length-1];
}
//some-other-cool-library.js
//返回数组的最后一个可能索引
Array.prototype.last=函数(){
返回此值。长度-1;
}
//some-consumer.js
导入“my cool library.js”;
导入“someothercoollibrary.js”;
常数a=[“a”、“b”、“c”];
//您可能希望它打印“c”,但它打印2
console.log(a.last());
您可能认为这是不可能的,但是如果您使用真正大的框架呢?假设您同时使用了Angular和lodash。像Angular这样的大型框架希望通过向某些对象原型添加一些辅助函数来简化工作,这并非完全不可能。然而,lodash是一个范围非常广泛的库,它还为您可能希望对集合执行的几乎每个操作添加了帮助函数

很可能这两个库都希望使用相同、简洁的helper函数名,但可能没有相同的函数签名。突然,您不知道应该如何调用和使用
Array.prototype.last

相反,当您利用依赖项注入和编写函数时,更值得赞赏的是,这些函数包含执行计算所需的所有参数,并且不会污染原型。这样,您就可以准确地决定使用哪个
last
函数以及何时使用

您还可以潜在地利用

以无污染为例:

//my-cool-library.js
//返回数组中的最后一个值
最后导出功能(arr){
返回arr[arr.length-1];
}
//some-other-cool-library.js
//返回数组的最后一个可能索引
最后导出功能(arr){
返回arr.length-1;
}
//some-consumer.js
从“my cool library.js”导入{last as myLast};
从“someothercoollibrary.js”导入{last};
常数a=[“a”、“b”、“c”];
//你知道你要用myLast吗
//它将如何行动
console.log(myLast(a));

当您加载的下一个库还想向数组添加名为“last”的帮助函数,而它们的函数签名与您自己的不匹配时,会发生什么情况?如果在应用程序而不是库中添加,也可以像polyfills一样添加,首先检查
array.prototype.last
是否存在,如果不存在,则添加它。如果您所依赖的另一个库正在覆盖核心功能,那么您可能不应该使用它,除非该库真正关注于覆盖某些部分,因为它会对其他库以及您的应用程序产生副作用。@Pavlo,直到将来的某个ES标准指定本机
数组.prototype.last
,您要使用的库开始依赖它。不,你不应该检查它是否存在,你应该总是安装你自己的版本,因为这是你的代码所期望的功能。不知道为什么有人会否决这个。但是,因为每个人都知道不应该对原型进行变异,“您将不可避免地与另一个库发生冲突”并不一定正确。这意味着现在可以做了。。。对吧?/s