如果我在String上实现方法x,如:
String.prototype.x = function (a) {...}
然后新版本的javascript实际上实现了x方法,但另一方面,要么返回与我的实现或函数不同的东西,其参数多于/少于我的实现。这会破坏我的实现并覆盖它吗?
答案 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]
答案 2 :(得分:1)
您的代码将覆盖默认实现。
但是,如果您的方法的接口与标准接口不兼容,您可能使用的库可能取决于标准行为,因此整个程序可能会因较新版本的库而中断。
一般来说,如果其他人做同样的事情就做一些可能会破坏的坏主意:如果另一个库认为将方法x
添加到标准字符串对象原型是个好主意怎么办?试图避免冲突是库的必要条件,但它对应用程序也有好处(如果应用程序编写得很好,那么它的很多代码可能与库非常相似,并且可能会在以后的库中发展)。
这种“修补”只对于为缺少该方法的破解或旧的javascript实现提供标准方法才有意义。修补标准原型只是因为你可能是一个坏主意,并会使你的代码成为一个难以共享页面的坏邻居。
答案 3 :(得分:0)
如果x的实现来自新版本的Javascript,那么它就是核心的一部分,因此当你编写String.prototype.x...
时,它就已存在,你将覆盖它。
此类事情的最佳做法是写
if( !String.prototype.x ){
String.prototype.x = function ...
//your