2015-04-29 15 views
5

volte vorrei aggiungere un comportamento a JS stringa comeÈ possibile estendere un oggetto javascript e quindi "cancellare" le estensioni dopo l'uso?

String.prototype.camelize = function() { 
    return this.replace (/(?:^|[-])(\w)/g, function (, c) { 
     return c ? c.toUpperCase() : ''; 
    }); 
}; 

Tuttavia è comunemente accettato che la modifica tipo primitivo è una pessima idea.

C'è qualche schema che posso seguire per assegnare temporaneamente funzioni a un tipo e rimuoverlo dopo l'uso? O qualsiasi cosa simile alla 'classe < < obj' di ruby ​​che modifica il prototipo di un solo oggetto?

EDIT: Il punto di farlo è quello di essere in grado di utilizzare la sintassi come

name = s.camelize();

o

se (s.hyphenize() Lunghezza < 8.);

Quindi, per favore, non preoccuparti dell'approccio statico.

Inoltre, questa domanda è in realtà più concentrata su come si dovrebbe manipolare oggetti js per fare di più con meno effetti collaterali.

+5

cosa c'è che non va con una semplice funzione senza modificare nulla? – Onheiron

+0

Perché devi farlo se è solo temporaneo? Oppure, perché no 'function camelize() {...}'? – Leo

risposta

3

È possibile eseguire esattamente ciò che si descrive: un oggetto JavaScript è solo un insieme di proprietà, alcune delle quali sono funzioni. Quindi, se è possibile creare:

String.prototype.camelize = function() { 
    return this.replace (/(?:^|[-])(\w)/g, function (, c) { 
     return c ? c.toUpperCase() : ''; 
    }); 
}; 

Quindi è possibile chiamare ugualmente:

String.prototype.camelize = null; 

Una volta fatto questo, la vostra capacità di camelize stringhe sia stata eliminata.

Ora, sono sicuro che hai buone ragioni per che vogliono fare in questo modo, ma non riesco a immaginare una situazione in cui la cosa che stai proponendo sia la cosa giusta da fare. Per fare qualcosa di simile in un modo più idiomatico, puoi creare un tipo che avvolge una stringa e offre una funzione camelize o puoi semplicemente associare quella funzione alle istanze della tua classe - potresti persino rilasciarla da una libreria di funzioni di utilità nella tua classe . Le funzioni di lancio sono uno dei grandi poteri di JavaScript.

Tieni presente che la tua avversione alle funzioni di utilità ti costringerà a prendere molti long-cut se stai scrivendo JavaScript. Potrebbe essere necessario mettere alcuni dei tuoi preconcetti su un lato fino a quando non si ha familiarità con le basi della lingua (ciò che alcuni potrebbero chiamare The Good Parts) e quindi rivisitarli quando si dispone di una maniglia più forte su di esso. Non è che non puoi scrivere codice corretto in JavaScript, ma non è come le altre lingue che hai usato e devi adattare le tue pratiche e la tua filosofia alla lingua, piuttosto che cercare di forzare la lingua nella forma dei tuoi preconcetti . Tutti lo fanno all'inizio e JavaScript è così flessibile che lo stesso funziona quasi allo, ma imparare a usarlo in un modo più idiomatico raccoglie grandi premi mentre si procede.

+0

'String.prototype.camelize = null' lascia la presenza aliena,' delete' potrebbe essere migliore. – Leonid

+0

Does 'String.prototype.camelize = null' in realtà rimuove la tua camelize dal 'namespace', o creerà problemi a qualcun altro che vuole la propria versione? Sui vostri commenti sulla lingua: la mia conclusione dai 5 o più linguaggi che ho usato ampiamente è che l'esigenza di una "programmazione idiomatica" è quasi sempre una risposta a un grosso difetto nella lingua (Verilog, in particolare, è così mal progettato che tu * devi * usare i modelli). Sembra che JS, sulla mia esposizione limitata, sia più o meno lo stesso. – EML

+1

@EML Lo fa - lo rimuovi dal prototipo, quindi non esiste più per niente su quella catena di prototipi. Come osserva @Leonid, impostandolo su 'null' significa che ora ha un valore' nullo' piuttosto che non esiste, che non è lo stesso perché JavaScript. L'errore che state facendo riguardo all'uso idiomatico della lingua è che l'idioma è tipicamente ciò che dà a un linguaggio la sua espressività e il suo potere. Evitarli rende tutte le lingue ugualmente cattive perché non consente a nessuno di giocare ai loro punti di forza. – glenatron

Problemi correlati