Frage

Es gibt ein paar Möglichkeiten, um Klasse-wie Verhalten in javascript, die häufigsten zu sein scheinen Prototyp basiert wie diese:

function Vector(x, y, x) {
    this.x = x;
    this.y = y;
    this.z = z;
    return this;
}

Vector.prototype.length = function () { return Math.sqrt(this.x * this.x ... ); }

und Verschluss-basierte Ansätze ähnlich

function Vector(x, y, z) {
    this.length = function() { return Math.sqrt(x * x + ...); }
}

Aus verschiedenen Gründen das letztere ist schneller, aber die ich gesehen habe (und die ich regelmäßig Schreibe) die Prototyp-version und war neugierig, was andere Leute tun.

War es hilfreich?

Lösung

Zuweisen von Funktionen zu den Prototypen ist besser (für die öffentlichen Methoden), da alle Instanzen der Klasse teilen die gleiche Kopie von der Methode.Wenn Sie das zuweisen der Funktion innerhalb der Konstruktor wie im zweiten Beispiel, jedes mal, wenn Sie eine neue Instanz erstellen, wird der Konstruktor erstellt eine neue Kopie der Länge-Funktion und weist es nur diese eine Instanz.

Aber diese letztere Technik ist nützlich, wenn Sie wollen jede Kopie seiner eigenen Kopie, die hauptsächliche Verwendung des Wesens zu tun private/Berechtigungen Methoden, die den Zugriff auf private Variablen, die innerhalb des Konstruktors und vererbte Sie über das Verschluss-Mechanismus.

Douglas Crockford hat eine gute Zusammenfassung.

Andere Tipps

Es gibt auch den Objekt-literal Ansatz zum Vorbild:

var Vector = function(){};

Vector.prototype = {
  init:function(x,y,z) {
    this.x = x;
    this.y = y;
    this.z = z;
  },
  length:function() {
    return Math.sqrt(x * x + ...);
  }
};

var v1 = new Vector();
v1.init(1,2,3);

Zum Glück bekomme ich verwenden prototype.js, bietet einige nette Wrapper.Damit Sie dies tun können:

var Person = Class.create({
    initialize: function(name) {
        this.name = name;
    },
    say: function(message) {
        return this.name + ': ' + message;
    }
});

Prototype.js Dokumentation:Die Definition von Klassen und Vererbung

Nun, ich habe nicht wirklich ein Gutachten zu dieser.Ich in der Regel am Ende mit Verschlüsse basierten Ansatz, nur weil es hält den code einfacher zu manager.Aber, ich habe mich mit dem Prototypen für Methoden, die haben eine Menge von Zeilen von code.

Sie haben die Wahl:

function Vector(x, y, z) {
  function length() {
    return Math.sqrt(x * x + ...);
  }
}

Das ist wahrscheinlich genauso langsam als Beispiel zwei ist, aber es sieht mehr wie Java/C# und ist etwas expliziter.

Ich bin ein großer fan der Verwendung von John Resig ' s library für diese.Leichtes, straight-forward, und Sie wissen bereits, wie zu verwenden es wenn Sie sind vertraut mit den "üblichen" object-oriented style.

Es gibt keine Klassen in javascript.

Es sind Objekte, die jedoch.Sie brauchen nicht, eine Klasse zu erstellen, ein Objekt in javascript.Es hat constuctor Funktionen, die Sie aufrufen können, die mit neuen, für Beispiel:

var james = new Person();

Sie können simulieren, Klasse, wie Verhalten mit:

Prototyp-Beispiel:

function Car (type) {
    this.type = type;
    this.color = "red";
}

Car.prototype.getInfo = function() {
    return this.color + ' ' + this.type + ' car';
};

Objekt-literal Beispiel

var car = {
    type: "honda",
    color: "red",
    getInfo: function () {
        return this.color + ' ' + this.type + ' car';
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top