实现原型方法

时间:2013-11-13 22:20:16

标签: javascript

如果我在String上实现方法x,如:

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

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

4 个答案:

答案 0 :(得分:3)

您将覆盖默认实现。

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

有一个scoped extension methods的提案,它被拒绝了,因为在JS引擎中实现它的计算成本太高。有人谈到解决这个问题的新提案(协议)。 ES6符号也会为你提供一种解决方法(但语法丑陋)。

然而,这不是打击 - 这是一个有趣的事实,没有人会告诉你。

没有人会在x

上实施名为String.prototype的方法

你可以实现它并逃脱它。严重的是, prollyfilling polyfilling 是许多用例的可行,富有表现力和有趣的解决方案。如果你不是在写图书馆,我认为这是可以接受的。

答案 1 :(得分: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/

答案 2 :(得分:1)

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

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

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

这种“修补”只对于为缺少该方法的破解或旧的javascript实现提供标准方法才有意义。修补标准原型只是因为你可能是一个坏主意,并会使你的代码成为一个难以共享页面的坏邻居。

答案 3 :(得分:0)

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

此类事情的最佳做法是写

if( !String.prototype.x ){
  String.prototype.x = function ...
    //your