如果我在 String 上实现了一个方法 x ,例如:
String.prototype.x = function (a) {...}
然后新版本的 javascript 实际上实现了 x 方法,但另一方面,要么返回与我的实现不同的东西,要么返回比我的实现更多/更少参数的函数。这会破坏我的实现并覆盖它吗?
如果我在 String 上实现了一个方法 x ,例如:
String.prototype.x = function (a) {...}
然后新版本的 javascript 实际上实现了 x 方法,但另一方面,要么返回与我的实现不同的东西,要么返回比我的实现更多/更少参数的函数。这会破坏我的实现并覆盖它吗?
任何使用它的代码都会使用你的。
有一个关于范围扩展方法的提议,但由于计算成本太高而无法在 JS 引擎中实现,因此被拒绝。正在讨论解决该问题的新提案(协议)。ES6 符号也会为您提供解决方法(但语法难看)。
然而,这不是关键——这是一个有趣的事实,没有人会告诉你。
x
方法String.prototype
您可以实施它并摆脱它。严肃地说,prollyfilling和polyfilling是许多用例的可行、富有表现力和有趣的解决方案。如果您不编写库,我认为这是可以接受的。
不,您将覆盖该函数的默认实现,从您声明/定义它的那一点开始。“新”实现将以其本机行为运行,直到您的实现被定义。
var foo = 'some arbitrary string';
console.log(foo.indexOf('s')); // logs [0]
String.prototype.indexOf = function(foo, bar) { return 'foo'; };
console.log(foo.indexOf()); // logs [foo]
插图:http: //jsfiddle.net/Z4Fq9/
您的代码将覆盖默认实现。
但是,如果您的方法的接口与标准接口不兼容,您可能使用的库可能取决于标准行为,因此整个程序可能会因更新版本的库而中断。
一般来说,如果其他人做同样的事情,做一些可能会破坏的事情是一个坏主意:如果另一个库认为x
向标准字符串对象原型添加一个方法是个好主意怎么办?尽量避免冲突对于库来说是必须的,但它对应用程序也有好处(如果应用程序编写得很好,那么它的许多代码可能与库非常相似,并且可能会在以后在库中发展)。
这种“修补”仅在为不存在该方法的损坏或旧 javascript 实现提供标准方法时才有意义。仅仅因为你可以修补标准原型是一个坏主意,并且会使你的代码成为一个很难与之共享页面的坏邻居。
如果 x 的实现来自新版本的 Javascript,它是核心的一部分,因此当您编写String.prototype.x...
它时它已经存在,并且您将覆盖它。
这种事情的最佳实践是写
if( !String.prototype.x ){
String.prototype.x = function ...
//your