Domanda

Ci sono un paio di modi per ottenere di classe-come comportamento in javascript, il più comune sembra essere il prototipo di come questo:

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 ... ); }

e la chiusura di un approccio simile a

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

Per vari motivi, l'ultimo è più veloce, ma ho visto (e mi capita spesso di non scrivere) la versione di prototipo ed era curioso di vedere cosa fanno le altre persone.

È stato utile?

Soluzione

Assegnazione di funzioni per il prototipo è meglio (per i metodi pubblici) perché tutte le istanze della classe condividono la stessa copia del metodo.Se si assegna la funzione all'interno del costruttore, come nel secondo esempio, ogni volta che si crea una nuova istanza, il costruttore crea una nuova copia del funzione della lunghezza e lo assegna a una istanza.

Tuttavia quest'ultima tecnica è utile se si vuoi ogni copia di avere la propria copia, l'uso principale che è quello di fare private/privilegi di metodi che hanno accesso al privato le variabili dichiarate all'interno del costruttore e ereditato tramite il meccanismo di chiusura.

Douglas Crockford ha una buona riepilogo.

Altri suggerimenti

C'è anche l'oggetto letterale approccio al prototipo:

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);

Per fortuna ho l'opportunità di utilizzare prototype.js, che fornisce alcune belle wrapper.Così si può fare questo:

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

Prototype.js Documentazione:Definizione di classi ed ereditarietà

Beh, non ho proprio il parere di un esperto su questo.Io di solito utilizzo le chiusure di un approccio basato solo perché mantiene il codice più semplice da manager.Ma mi sono trovato utilizzo di prototipi per i metodi che sono un sacco di righe di codice.

Avete anche la scelta di:

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

Che, probabilmente, è lento come esempio due, ma è più simile a Java/C# ed è un po ' più esplicito.

Io sono un grande fan di utilizzo John Resig biblioteca per questo.Leggero, straight-forward, e sai già come usarlo se si ha familiarità con il 'solito' stile orientato agli oggetti.

Non ci sono classi in javascript.

Ci sono oggetti tuttavia.Non c'è bisogno di una classe per creare un oggetto in javascript.Non constuctor funzioni che è possibile richiamare con nuove ad esempio:

var james = new Person();

È possibile simulare in classe un comportamento simile con:

prototipo esempio:

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

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

oggetto letterale esempio

var car = {
    type: "honda",
    color: "red",
    getInfo: function () {
        return this.color + ' ' + this.type + ' car';
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top