不鼓励原型JavaScript本机类型?

时间:2010-06-21 13:56:21

标签: javascript prototype

在JavaScript的本机类型(如Array,String,Number等)中构建其他功能的原型是不是一个坏主意?

我认为拥有像myArr.pop(等)这样的功能会很棒,但如果有一天会成为ECMAScript x的一部分 - 并且与我的实现不同,那么,它可能会破坏整个软件?

2 个答案:

答案 0 :(得分:4)

Prototype是一个广泛扩展本机Javascript类型和DOM类的库,并且非常好地展示了扩展Javascript本机类型的好处,坏处和丑处。

好的:你得到看起来很自然的Javascript代码。

坏:你忘记了你实际上正在使用Prototype - 当你切换到一个不使用Prototype的项目时产生混乱。 (为什么我不能......哦,对,这是原型能力。)

丑陋:如果由于库,浏览器或规范存在冲突而导致方法定义(两种方法在合同或签名上有所不同)存在冲突,则可能必须修改客户端代码以保持兼容性。这使得在已经困扰它们的世界中更多地考虑兼容性。

为了兼容性并保持我自己的想法清晰,我个人不会扩展原生或DOM javascript类型,并且喜欢较少侵入的库到Prototype。

但是,如果你对这些缺点感到放心,不要让我阻止你。

答案 1 :(得分:2)

如果您尝试复制为某些浏览器而非其他浏览器定义的方法,请尝试使该定义与本机实现相匹配。

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,'');
    }
}

如果可能,将使用本机方法。 如果你推出自己的方法,试着给它们一个不太可能被抢先的名字

我喜欢为数组提供shuffle和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;
}

如果您确实添加了原型,请确保记录原型并在每个使用它们的脚本中引用文档 - 如果有人打算使用你的代码,包括你。