我应该修改String的原型吗?

时间:2009-11-09 11:18:55

标签: javascript prototype

我准备在javascript中创建一个修剪功能,但由于我不想重新发明轮子,我用Google搜索了这种方法。
我找到了这个链接 http://www.somacon.com/p355.php

它提供的解决方案是:

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
    return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
    return this.replace(/\s+$/,"");
}

它也说如果你不想改变String的原型,那就用这个:

function trim(stringToTrim) {
    return stringToTrim.replace(/^\s+|\s+$/g,"");
}
function ltrim(stringToTrim) {
    return stringToTrim.replace(/^\s+/,"");
}
function rtrim(stringToTrim) {
    return stringToTrim.replace(/\s+$/,"");
}

我想知道在什么情况下应该修改String的原型或说出任何对象。

3 个答案:

答案 0 :(得分:7)

trim函数将在ECMAScript第五版中标准化,并且已经存在于某些浏览器中。所以:

  1. 是的,将它们添加到原型中是完全合适的,但

  2. 如果它们已经存在,你不应该将它们添加到原型中,因为你只是用一个慢速的JavaScript代替快速的原生代码函数。

  3. 在两次替换时进行修剪的速度通常稍快:

    // Add ECMA262-5 string trim if not supported natively
    //
    if (!('trim' in String.prototype)) {
        String.prototype.trim= function() {
            return this.replace(/^\s+/, '').replace(/\s+$/, '');
        };
    }
    

答案 1 :(得分:2)

一般情况下 - 不要修改buildin对象的原型。 但是你可以添加你方便的功能。

在添加之前始终检查:

//pre-1.6 javascript
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(elt) {
        var len = this.length >>> 0;
        var from = Number(arguments[1]) || 0;
        from = (from < 0) ? Math.ceil(from) : Math.floor(from);
        if (from < 0)
            from += len;
        for (; from < len; from++) {
            if (from in this && this[from] === elt)
                return from;
        }
        return -1;
    };
}

这样你就不会覆盖可能在某个时候可用的更快的buildin函数......

答案 2 :(得分:1)

对于这种非常有用的实用函数,我想你可以修改原型。 但是你应该知道这个函数可能已经在少数浏览器中本地存在,所以你应该检查一下:https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/String