在JavaScript的本机类型(如Array,String,Number等)中创建附加功能的原型是一个坏主意吗?原型JavaScript原生类型,气馁?
我认为拥有像myArr.pop()等功能会很棒,但如果某一天成为ECMAScript x的一部分,并且与我的实现不同,那么它可能会破坏整个软件?
在JavaScript的本机类型(如Array,String,Number等)中创建附加功能的原型是一个坏主意吗?原型JavaScript原生类型,气馁?
我认为拥有像myArr.pop()等功能会很棒,但如果某一天成为ECMAScript x的一部分,并且与我的实现不同,那么它可能会破坏整个软件?
Prototype是一个广泛扩展原生Javascript类型和DOM类的库,并且非常好地展示了扩展Javascript本地类型的好,坏和丑。
好:你得到自然的Javascript代码。
不好:你忘了你实际上在使用Prototype - 当你切换到一个不使用Prototype的项目时会产生混淆。 (为什么我不能......哦,对,这是一个Prototype功能。)
丑陋:如果由于冲突库而导致方法定义(两个方法在契约或签名中不同)有冲突,浏览器或规范,您可能必须修改客户端代码以保持兼容性。这使得在一个已经困扰他们的世界中再考虑一个兼容性问题。为了兼容性和保持我自己的想法清晰起见,我个人不要扩展本地或DOM的JavaScript类型,并且选择较少侵入性的库到Prototype。
但是,如果您对这些缺点感到放心,不要让我阻止您。
如果您试图复制为某些浏览器而不是其他浏览器定义的方法,请尝试使定义与本机实现相匹配。
if(![].indexOf){
Array.prototype.indexOf= function indexOf(what, i){
i= i || 0;
var L= this.length;
while(i< L){
if(this[i]=== what) return i;
++i;
}
return -1;
}
}
if(![].map){
Array.prototype.map= function map(fun, scope){
var L= this.length, A= Array(this.length), i= 0, val;
if(typeof fun== 'function'){
while(i< L){
if(i in this){
A[i]= fun.call(scope, this[i], i, this);
}
++i;
}
return A;
}
else throw 'missing function argument';
}
}
if(!''.trim){
String.prototype.trim= function trim(){
return this.replace(/^\s+|\s+$/g,'');
}
}
如果可能,将使用本地方法。 如果你滚你自己的方法,尽量给他们一个名字,是不是可能被捷足先登
我想有一个洗牌和数组一个naturalSort方法, 但我给他们稍微偏离节拍名。
Array.prototype.a1Sort= function(){
var a, b, a1, b1, rx= /(\d+)|(\D+)/g, rd= /\d+/;
return this.sort(function(as, bs){
a= String(as).toLowerCase().match(rx);
b= String(bs).toLowerCase().match(rx);
while(a.length && b.length){
a1= a.shift();
b1= b.shift();
if(rd.test(a1) || rd.test(b1)){
if(!rd.test(a1)) return 1;
if(!rd.test(b1)) return -1;
if(a1!= b1) return a1 - b1;
}
else if(a1!= b1) return a1> b1? 1: -1;
}
return a.length - b.length;
});
}
Array.prototype.disorder= function(force){
var i, temp, L= this.length, A= force? this: this.concat();
while(--L){
i= Math.floor(Math.random()*L);
temp= A[i];
A[i]= A[L];
A[L]= temp;
}
return A;
}
如果添加到原型,请务必将其记录下来,并在使用他们 - 是否有人曾经打算用你的代码工作,包括你每一个脚本引用文档。
负责原型框架的人不这么认为。 – Pointy 2010-06-21 14:12:48
如果无法完成,他们不会让你。 – 2010-06-21 14:37:38