Frage

Ich bin gerade dabei, meinen Code neu zu verarbeiten. Ich habe Probleme, mich dafür zu entscheiden, wie genau ich ein paar Dienstprogrammfunktionen implementieren kann, die ich habe. Speziell, Wenn bestimmte Funktionen in meinem persönlichen Namespace besser sind oder JS -Objekte direkt erweitern.

Beispiel für die Erweiterung der nativen JavaScript -Objekte

(Ist das der richtige Begriff?).

String.prototype.prettyDate = function(){
  return (this.substr(5,2) + '/' + this.substr(8) + '/' + this.substr(0,4));
}
var myString = "2010-12-27";
//logs 12/27/2010
console.log(myString.prettyDate);

Beispiel mit meinem eigenen Namespace

var myNamespace = (function(){
   var my = {};
   my.prettyDate = function ( dateStr ){
      return (dateStr.substr(5,2) + '/' + dateStr.substr(8) + '/' + dateStr.substr(0,4));
   }
return my;
}());
var pretifiedDate = myNamespace.prettyDate('2010-12-27');
//logs 12/27/2010
console.log(pretifiedDate);

Fragen zu berücksichtigen

  1. Wann wird ein Dienstprogramm zu Recht in ein natives JavaScript -Objekt eingefügt?
  2. Wie kann ich feststellen, wann ein Dienstprogramm besser in meinem eigenen Namespace ist?
War es hilfreich?

Lösung

  1. Fast nie, wegen:

    A/ mögliche Konflikte mit anderen Bibliotheken

    b/ erweiterte Funktionen werden als Eigenschaften durch Itertiert von iteriert in Bediener, der Probleme aufweist, es sei denn

    Sie können dies für kleine, einkriptische Arbeiten rechtfertigen, aber nur, wenn Sie 200% sicher sind, dass niemand niemals versucht, diesen Code irgendwo wiederzuverwenden. Verwenden Sie es in diesem Fall nur für Funktionen, die mehr als ein Modul Ihres Codes umfassen. Erweiterung der Zeichenfolge mit TRIM () - OK, Erweiterung der Zeichenfolge mit PrettyDate () - zweifelhaftes, Objekt mit displayaPageHeader () - beängstigend.

  2. Also fast immer.

Andere Tipps

Schau dieses Video an:

John Resig ist der Ansicht, dass die Erweiterung der nativen Objekte ein Rezept für eine Katastrophe ist, insbesondere wenn ein Rahmen oder eine Anwendung wahrscheinlich zu etwas wachsen, das weit mehr tut als ursprünglich beabsichtigt.

Leider hat diese Frage keine "richtige" Antwort. Es ist eine gute Diskussion, aber ich fürchte, es wird hier geschlossen sein. Ob einheimische Objekte überhaupt erweitert werden sollten, ist eine subjektive Debatte und wenn Sie akzeptieren, dass es bedingt in Ordnung ist, die Antwort auf "Wann?" ist "hängt davon ab."

Wenn Sie die Kontrolle über die Verwendung haben und ob er mit einem anderen Code kollidiert wird, gibt es wirklich keinen Grund, warum Sie es nicht sollten. Es kann ziemlich bequem sein und die Codegröße erheblich reduzieren.

Wenn es ein echtes Problem bei der Erweiterung der nativen Objekte gibt, besteht darin for(var i in obj) ohne Vorhut vor Erweiterungen in der Prototypkette.

OK ... Ich bin kein Experte darin, aber fast nie! Dinge, die Sie tun, sind in Ihrem Namespace sicherer. Und alles funktioniert gut, wenn Sie dem Modulmuster folgen http://www.yuiblog.com/blog/2007/06/12/module-pattern/

Es gibt jedoch einige kleine Tricks, die es uns ermöglichen, den Namenspace anderer Name zu vermeiden. pro Beispiel:

var myNamespace = {}; //my namespace, unsafely written

//Better solution
if(typeof myNamespace === 'undefined'){
    var myNamespace = {};
}

//Shorter solution
var myNamespace = myNamespace || {};

Es hängt davon ab, wie viel Kontrolle Sie über den Code ausgeführt/geladen werden:

  1. Wenn alles unter Ihrer Kontrolle liegt, ist es nichts Falsches, integrierte Objekte zu erweitern, ist JavaScript so konzipiert, dass dies in der Lage ist, dies zu tun. Das einzige Problem dabei ist, dass Sie unerwartete Probleme haben können, wenn zwei Bibliotheken das gleiche ändern. Zum Glück würden Sie sich das nicht selbst antun, oder?

  2. Wenn Sie es nicht wissen/nicht wissen, ist ein Namespace viel sicherer, wenn auch klobig und ausführlich. Das ist immer sicherer.

Persönlich bevorzuge ich die zweite Option, weil ich übermäßig ausführliche Code nicht mag und Namespaces lustig aussehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top