2009-11-09 8 views
5

Stavo per creare una funzione di assetto in javascript, ma come io non voglio reinventare la ruota Ho cercato su google per questo metodo.
Ho trovato questo link http://www.somacon.com/p355.phpDovrei modificare il prototipo di String?

La soluzione ha fornito è:

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+$/,""); 
} 

anche si dice se si don'y Wnt di cambiare il prototipo di stringa quindi utilizzare questo:

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

Vorrei sapere in quale scenario si dovrebbe non modificare il prototipo di stringa o dire qualsiasi oggetto.

risposta

7

Le trim funzioni devono essere standardizzati in ECMAScript quinta edizione, così come già essere presente in alcuni browser . Quindi:

  1. Sì, aggiungendoli al prototipo è totalmente appropriato, ma

  2. Si consiglia di non aggiungerli al prototipo se sono già lì, come devi semplicemente essere sostituendo una veloce funzione di codice nativo con uno lento JavaScript.

E 'inoltre in genere marginalmente più veloce di fare assetto come due sostituisce:

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

+1 per 'if (! ('assetto' in String.prototype)) {' –

+0

Cosa c'è di sbagliato con if (! String.prototype.trim)? Sembra più efficiente per me. – KooiInc

+3

'tale dicitura è più esplicito su ciò che è il test per, non basandosi sulla truthiness di una proprietà o il bizzarro e terribile capriccio JavaScript del risintonizzazione un nuovo' undefined' per qualcosa che qualsiasi altra lingua avrebbe considerato un'eccezione. Per questo caso particolare ovviamente non ha importanza, ma in generale utilizzo sempre 'in' per testare se un oggetto ha una proprietà. – bobince

1

Per questo tipo di funzione di utilità molto utile, direi che è possibile modificare il prototipo. Ma si deve essere consapevoli che la funzione potrebbe già esistere nativamente in alcuni browser, così si dovrebbe verificare: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/String

+0

e in tal caso non si dovrebbe, è esso in relazione a qualche genere di spese generali o cosa? –

+0

non c'è "non si dovrebbe" caso, basta essere consapevoli di ciò che ha detto Fabien. –

+0

great javascript 1.8.1 sta avendo il metodo string.trim() https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/String/Trim –

2

In generale - non modificare un prototipo di oggetti buildin. Ma naturalmente puoi aggiungere la tua comoda funzione.

E sempre controllare prima di aggiungere:

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

In questo modo non si è sovrascrivere poltiglia più veloce buildin funzione che potrebbe diventare disponibile a volte ...

Problemi correlati