Должен ли я изменить прототип String? - PullRequest
6 голосов
/ 09 ноября 2009

Я собирался создать функцию обрезки в javascript, но, поскольку я не хочу изобретать велосипед, я прибегнул к поиску этого метода.
Я нашел эту ссылку 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 ]

7 голосов
/ 09 ноября 2009

Функции trim должны быть стандартизированы в пятом издании ECMAScript, а также уже присутствовать в некоторых браузерах.Итак:

  1. Да, добавление их к прототипу абсолютно уместно, но

  2. Не следует добавлять их в прототип, если ониВы уже там, поскольку вы просто замените быструю функцию с собственным кодом медленной JavaScript-функцией.

Как правило, триммирование выполняется несколько быстрее:

// Add ECMA262-5 string trim if not supported natively
//
if (!('trim' in String.prototype)) {
    String.prototype.trim= function() {
        return this.replace(/^\s+/, '').replace(/\s+$/, '');
    };
}
2 голосов
/ 09 ноября 2009

В общем случае - не модифицируйте прототип встроенных объектов. Но, конечно, вы можете добавить свою удобную функцию.

И всегда проверяйте, прежде чем добавить:

//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;
    };
}

Таким образом, вы не перезаписали более быструю встроенную функцию, которая может когда-нибудь стать доступной ...

1 голос
/ 09 ноября 2009

Для такого рода очень полезной служебной функции я бы сказал, что вы можете изменить прототип. Но вы должны знать, что функция может уже существовать в некоторых браузерах, поэтому вы должны проверить это: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/String

...