2015-04-29 13 views
5

Manchmal möchte ich Verhalten JS String wieIst es möglich, ein JavaScript-Objekt zu erweitern und die Erweiterungen nach dem Löschen zu löschen?

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

hinzufügen Jedoch es allgemein wird vereinbart, dass primitive Art zu modifizieren eine schreckliche Idee.

Gibt es irgendwelche Muster, denen ich folgen kann, um Funktionen vorübergehend einem Typ zuzuweisen und nach Gebrauch zu entfernen? Oder etwas ähnliches wie Rubin 'Klasse < < Obj', die den Prototyp eines Objekts nur ändern?

EDIT: Der Punkt, dies zu tun in der Lage seine Syntax zu verwenden wie

name = s.camelize();

oder

if (s.hyphenize() Länge <. 8);

Also bitte nicht mit statischen Funktion Ansatz stören.

Auch diese Frage ist eigentlich mehr darauf konzentriert, wie man js Objekte manipulieren sollte, um mehr mit weniger Nebenwirkungen zu tun.

+5

Was ist mit nur einer normalen Funktion falsch, ohne etwas zu ändern? – Onheiron

+0

Warum müssen Sie dies tun, wenn es nur vorübergehend ist? Oder, warum funktioniert 'camelize() {...}' nicht? – Leo

Antwort

3

Sie können genau das tun, was Sie beschreiben - ein JavaScript-Objekt ist nur ein Bündel von Eigenschaften, von denen einige Funktionen sind. Also, wenn Sie können erstellen:

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

Dann können Sie gleich anrufen:

String.prototype.camelize = null; 

Sobald Sie das getan haben, Ihre Fähigkeit zu camelize Strings ausgerottet wird.

Nun, ich bin sicher, dass Sie für gute Gründe haben wollen die Dinge so zu tun, aber ich kann keine Situation vorstellen, wo das, was Sie vorschlagen, das Richtige zu tun ist. Um etwas so idiomatisch zu machen, könnten Sie einen Typ erstellen, der eine Zeichenfolge umschließt und eine camelize-Funktion anbietet, oder Sie könnten diese Funktion einfach an Instanzen Ihrer Klasse binden - Sie könnten sie sogar aus einer Bibliothek mit Hilfsfunktionen in Ihre Klasse einfügen . Funktionen zu werfen ist eine der großen Stärken von JavaScript.

Seien Sie sich bewusst, dass Ihre Abneigung gegen Utility-Funktionen Sie zwingen wird, viele lange Schnitte zu nehmen, wenn Sie JavaScript schreiben. Sie müssen vielleicht einige Ihrer Vorurteile auf eine Seite legen, bis Sie sich mit den Grundlagen der Sprache vertraut gemacht haben (was manche vielleicht Die guten Teile nennen) und sie dann wieder besuchen, wenn Sie einen stärkeren Griff darauf haben. Es ist nicht so, dass Sie in JavaScript keinen korrekten Code schreiben können, aber es ist nicht wie in anderen Sprachen, die Sie verwendet haben und Sie müssen Ihre Praktiken und Ihre Philosophie in die Sprache einpassen, anstatt die Sprache in die Form Ihrer Vorurteile zu zwingen . Jeder tut das zuerst und JavaScript ist so flexibel, dass es sehr nahe funktioniert, aber lernen, es auf eine idiomatische Weise zu verwenden, erntet große Belohnungen, wie Sie weitermachen.

+0

'String.prototype.camelize = null 'lässt Alien-Präsenz zurück,' delete' könnte besser sein. – Leonid

+0

Hat 'String.prototype.camelize = null "Entferne dein camelize tatsächlich aus dem 'namespace', oder schafft es Probleme für jemand anderen, der seine eigene Version haben möchte? Zu Ihren Sprachkommentaren: Meine Schlussfolgerung aus den etwa fünf Sprachen, die ich ausführlich verwendet habe, ist, dass eine Anforderung für "idiomatische Programmierung" fast immer eine Antwort auf einen großen Fehler in der Sprache ist (insbesondere Verilog ist so schlecht konzipiert, dass Sie * müssen * Muster verwenden). JS scheint auf meiner beschränkten Exposition ähnlich zu sein. – EML

+1

@EML Es tut - Sie entfernen es aus dem Prototyp, so dass es nichts mehr für diese Prototyp-Kette gibt. Wie @Leonid beobachtet, bedeutet das Setzen auf "null", dass es jetzt einen Wert von "null" hat, anstatt dass es nicht existiert, was nicht dasselbe ist wie bei JavaScript. Der Fehler, den Sie über idiomatische Sprachgebrauch machen, ist, dass das Idiom in der Regel ist, was einer Sprache ihre Ausdruckskraft verleiht. Sie zu vermeiden, macht alle Sprachen gleich schlecht, weil es keiner von ihnen erlaubt, ihre Stärken auszuleben. – glenatron

Verwandte Themen