Javascript 实现原型方法

Javascript 实现原型方法,javascript,Javascript,如果我在字符串上实现了方法x,如: String.prototype.x = function (a) {...} 然后新版本的javascript实际上实现了x方法,但从另一个角度看,要么返回与我的实现不同的东西,要么返回比我的实现多/少参数的函数。这会破坏我的实现并覆盖它吗?否,您将从声明/定义该函数的点开始覆盖该函数的默认实现。在定义实现之前,“新”实现将以其本机行为运行 var foo = 'some arbitrary string'; console.log(foo.indexO

如果我在字符串上实现了方法x,如:

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

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

否,您将从声明/定义该函数的点开始覆盖该函数的默认实现。在定义实现之前,“新”实现将以其本机行为运行

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]

插图:

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

这类事情的最佳实践是写作

if( !String.prototype.x ){
  String.prototype.x = function ...
    //your 
您将覆盖默认实现。 任何使用它的代码都将使用您的代码

有一个关于的建议,但被拒绝了,因为它在计算上太昂贵,无法在JS引擎中实现。有人谈论一项新的提案(协议)来解决这个问题。ES6符号也将为您提供一种解决方法(但语法难看)

然而,这并不是重点-这里有一个有趣的事实,没有人会告诉你

没有人会在
String.prototype上实现名为
x
的方法
你可以实现它,并且不受惩罚。说真的,prollyfillingpolyfilling对于许多用例来说都是一个可行的、有表现力的和有趣的解决方案。如果您没有编写库,我认为这是可以接受的。

您的代码将覆盖默认实现

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

一般来说,如果其他库也这么做了,那么做可能会导致崩溃是一个坏主意:如果其他库认为向标准字符串对象原型添加方法
x
是一个好主意,该怎么办?尽量避免冲突对于库来说是必须的,但对于应用程序来说也是很好的(如果一个应用程序写得很好,那么它的许多代码可能与库非常相似,以后可能会在库中演变)


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

谢谢你的回答,但是你能从你声明/定义它的时候开始详细阐述一下吗`@London只要你写
String.prototype.x=[something]
“新版本的JavaScript”将在执行重新定义的代码之前就已经定义了该方法……这是有风险的,对于pollyfilling retrospect来说,在可用时获取本机实现是很有用的。如果对新方法执行此操作,并且在不同的浏览器中获得不同的行为,这可能是非常有风险的。