6

如果我在 String 上实现了一个方法 x ,例如:

String.prototype.x = function (a) {...}

然后新版本的 javascript 实际上实现了 x 方法,但另一方面,要么返回与我的实现不同的东西,要么返回比我的实现更多/更少参数的函数。这会破坏我的实现并覆盖它吗?

4

4 回答 4

3

您将覆盖默认实现。

任何使用它的代码都会使用你的。

有一个关于范围扩展方法的提议,但由于计算成本太高而无法在 JS 引擎中实现,因此被拒绝。正在讨论解决该问题的新提案(协议)。ES6 符号也会为您提供解决方法(但语法难看)。

然而,这不是关键——这是一个有趣的事实,没有人会告诉你。

没有人会实现一个调用的x方法String.prototype

您可以实施它并摆脱它。严肃地说,prollyfillingpolyfilling是许多用例的可行、富有表现力和有趣的解决方案。如果您不编写库,我认为这是可以接受的。

于 2013-11-13T22:37:57.693 回答
2

不,您将覆盖该函数的默认实现,从您声明/定义它的那一点开始。“新”实现将以其本机行为运行,直到您的实现被定义。

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/

于 2013-11-13T22:23:28.177 回答
1

您的代码将覆盖默认实现。

但是,如果您的方法的接口与标准接口不兼容,您可能使用的库可能取决于标准行为,因此整个程序可能会因更新版本的库而中断。

一般来说,如果其他人做同样的事情,做一些可能会破坏的事情是一个坏主意:如果另一个库认为x向标准字符串对象原型添加一个方法是个好主意怎么办?尽量避免冲突对于库来说是必须的,但它对应用程序也有好处(如果应用程序编写得很好,那么它的许多代码可能与库非常相似,并且可能会在以后在库中发展)。

这种“修补”仅在为不存在该方法的损坏或旧 javascript 实现提供标准方法时才有意义。仅仅因为你可以修补标准原型是一个坏主意,并且会使你的代码成为一个很难与之共享页面的坏邻居。

于 2013-11-13T22:40:16.330 回答
0

如果 x 的实现来自新版本的 Javascript,它是核心的一部分,因此当您编写String.prototype.x...它时它已经存在,并且您将覆盖它。

这种事情的最佳实践是写

if( !String.prototype.x ){
  String.prototype.x = function ...
    //your 
于 2013-11-13T22:34:42.083 回答