2016-09-19 4 views
0

Ich möchte einige Funktionen für alle meine Arrays verfügbar machen.Ändern Array.prototype in node.js

Zum Beispiel möchte ich eine Funktion Duplikate entfernen:

Array.prototype.uniq = function() { 
    return Array.from(new Set(this)); 
}; 

Aber ich will diese Funktion Arbeit in meinem ganzen node.js Projekt machen.

Wird es funktionieren, wenn ich es einfach in server.js, die ausgeführt wird, wenn ich npm start eingeben?

Es wäre toll, wenn es auch auf dem Client funktioniert. Ist es möglich oder sollte ich Server und Client streng getrennt voneinander betrachten?

Ist es eine schlechte Übung, Array.prototype so zu erweitern? Ich denke nur, es scheint dumm, den Code viele Male zu schreiben.

Weitere Optionen könnten

function uniquify(arr) { 
    return Array.from(new Set(arr)); 
} 

aber array.uniq() scheint besser als uniquify(array) zu bedienen.

+0

Vielleicht besser für Code-Review? – Neal

Antwort

0

Es ist als "schlechte Praxis", den Array-Prototyp zu manipulieren.

Ich (persönlich) glaube nicht, dass es so schlecht ist, es mit etwas zu tun, das einen sehr "einzigartigen" Namen hat, aber dann sind eindeutige Namen schwer zu bekommen.

Es ist viel besser, einige Dienstprogrammfunktionen zu haben, die Sie aufrufen und verwenden können, wenn Sie möchten.

+1

Es kann nicht einfach ohne Begründung "schlechte Praxis" genannt werden. Besonders wenn es sich um ein eigenes Programm handelt, macht es Sinn, dass sie eine Domäne modelliert, die ihren Bedürfnissen entspricht. Wenn der fragliche Code so entworfen wird, dass er an andere verteilt wird, um sie in seine eigenen Projekte einzubeziehen, dann würde ich sagen, dass es rücksichtslos (dh "schlecht") ist, native Prototypen zu manipulieren. Siehe die Antwort von @ TJCrowder für ein besseres Verständnis. – naomik

+0

Es ist wie das "Eval ist böse" noch einmal. Sicher, wenn du 'eval' nicht verstehst, wirst du es wahrscheinlich missbrauchen und haufenweise Probleme begrüßen. Dies bedeutet jedoch nicht, dass seine Verwendung in bestimmten Szenarien nicht gerechtfertigt ist. – naomik

+0

Meine und TJs Antworten sind im Grunde das Gleiche, nur die andere Antwort hat mehr Wörter. ;-) – Neal

3

Erstens: Wenn Sie Eigenschaften Array.prototype, nicht fügen Sie sie über einfache Zuordnung hinzufügen gehen. Auf diese Weise werden aufzählbare Eigenschaften erstellt, und Code, der auf Arrays basiert, die standardmäßig keine aufzählbaren Eigenschaften aufweisen, wird unterbrochen.

So defineProperty statt:

Object.defineProperty(Array.prototype, "uniq", { 
    value: function uniq() { 
     return Array.from(new Set(this)); 
    } 
}); 

Um Ihre Fragen:

Wird es funktionieren, wenn ich es nur in server.js setzen, die ausgeführt wird, wenn ich npm start geben?

Ich bin mir nicht sicher, was server.js Sie reden, aber wenn Sie sprechen Dateien ändern, die eingebaut sind Teile von Knoten oder npm anstatt Teile des Projekts, empfehle ich stark nicht so tun.

Es wäre toll, wenn es auch auf dem Client funktioniert. Ist es möglich oder sollte ich Server und Client streng getrennt voneinander betrachten?

Sie sind völlig getrennt. Wenn Sie dies auf dem Client tun möchten, müssen Sie ein Skript hinzufügen, das uniq auf dem Client hinzufügt.

Ist es eine schlechte Praxis, Array.prototype so zu erweitern? Ich denke nur, es scheint dumm, den Code viele Male zu schreiben.

Es gibt zwei Lager Gedanken auf, dass:

  1. Ja, es ist schlecht. Es kann vorkommen, dass Sie Namenskonflikte mit anderen Benutzern bekommen, die ihre eigenen, unterschiedlichen uniq hinzufügen. Kombinieren von Code aus mehreren Quellen wird sehr, sehr häufig, erhöht die Chancen dieser Probleme. Zukünftige Versionen der Sprache können uniq hinzufügen. Da das Komitee, das die Sprache steuert (TC-39), versucht, mögliche Konflikte zu umgehen, würde es Ihre Arbeit erschweren, wenn Ihre clientseitige Bibliothek populär wird. (MooTools hat, mehr als einmal.)

  2. Nein, es ist nicht schlecht, es ist, was Prototypen sind. Namenskonflikte können gegebenenfalls behandelt werden. TC-39 kann es klumpen.

Sie müssen Ihre eigene Entscheidung treffen, ob Sie es tun.

+0

+ für diese coole Antwort. Zum Beispiel, wenn Sie dem Objekt etwas hinzufügen.Prototyp 'wie' Object.prototype.compare = func ... 'wird es jQuery brechen und dich an den Haaren ziehen :) noch ... das sollte dich nicht davon abhalten, die Standardeigenschaften zu ändern. Tun Sie es einfach wie in dieser Antwort vorgeschlagen. – Redu

1

Eine weitere Option ist die Array-Klasse zu erweitern, so dass Sie das Beste aus beiden Welten bekommen ...

Sie können addieren, was Methoden, die Sie zu Ihren erweiterten newArray Klassen wollen zwar nicht den globalen Namensraum zu verschmutzen.

Soweit im Browser - Sie müssen das gleiche tun, aber es hängt davon ab, ob Sie ES6 auf ES5 transponieren, sich auf ES6 Browser beschränken oder wenn Sie nach einer Möglichkeit suchen, Dinge zu machen arbeite auch in ES5.

Verwenden Sie eine Factory-Funktion, um Ihre newArray Art zurückzugeben, wäre ein Ansatz - achtsam, um sicherzustellen, dass alle Methoden, die Sie hinzufügen, nicht iterierbar sind.

Es gibt eine Diskussion davon hier:

Extending Array with ES6 classes

+0

Gute Idee. Dafür brauchst du aber keine Klassen. [Array Unterklassierung] (https://www.quora.com/What-is-the-array-inheritance-problem-and-why-is-it-so-hard-to-solve/answer/%C3% 96mer-Ka% C5% 9Fdarma? Srid = 01By) kann immer noch mit ES6 oder sogar mit ES5 unter Verwendung von 'Object.setPrototypeOf' oder' __proto__' gemacht werden – Redu

0

Für diese Art von Methoden, die Sie mehrmals in Ihrer Anwendung verwenden möchten, können Sie eine Datei wie erstellen:

appUtils. js

var appUtils = {}; 

appUtils.getUniqueArray = function() { 
    return Array.from(new Set(this)); 
}; 

// can add other methods as well 

und Sie können diese Datei benötigen, wo immer Sie diese f verwenden möchten Salbung. Wenn Sie andere wiederverwendbare Methoden haben, können Sie sie wie oben hinzufügen.

Verwandte Themen