Pregunta

Hay un par de maneras de obtener la clase-como el comportamiento de javascript, el más común parece ser el prototipo basado como este:

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

y cierre de la base de planteamientos similares a

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

Por diversas razones, el último es más rápido, pero he visto (y frecuentemente me hacen escribir) la versión prototipo y fue curioso como a lo que hacen otras personas.

¿Fue útil?

Solución

La asignación de funciones para el prototipo es mejor (para métodos públicos) porque todas las instancias de la clase comparten la misma copia de el método.Si se asigna la función dentro del constructor como en el segundo ejemplo, cada vez que se crea una nueva instancia, el constructor crea una nueva copia de la longitud de la función y se asigna a la que una instancia.

Sin embargo esta última técnica es útil si quiero cada copia es una copia, el uso principal de ese ser privados/los privilegios de los métodos que tienen acceso privado a las variables declaradas dentro del constructor y heredado a través del mecanismo de cierre.

Douglas Crockford tiene una buena resumen.

Otros consejos

También existe el objeto literal enfoque para el 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);

Afortunadamente puedo llegar a usar prototype.js, que ofrece unas bonitas contenedores.Así que usted puede hacer esto:

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

Prototype.js Documentación:Definición de clases y herencia

Bueno, realmente no tengo una opinión experta en esto.Yo por lo general terminan utilizando los cierres enfoque basado sólo porque mantiene el código más sencillo para el administrador.Pero, me he encontrado en el uso de prototipos para los métodos que tiene un montón de líneas de código.

Usted también tiene la opción de:

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

Que es, probablemente, tan lento como ejemplo dos, pero se parece más a Java/C# y es un poco más explícito.

Soy un gran fan de usar John Resig de la biblioteca para esto.Ligero, sencillo, y usted ya sabe cómo utilizar si usted está familiarizado con la 'costumbre' estilo orientado a objetos.

No hay clases en javascript.

Hay objetos sin embargo.Usted no necesita una clase para crear un objeto en javascript.Tiene constuctor funciones que se pueden invocar con los nuevos, por ejemplo:

var james = new Person();

Puede simular la clase como el comportamiento con:

prototipo de ejemplo:

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

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

objeto literal ejemplo

var car = {
    type: "honda",
    color: "red",
    getInfo: function () {
        return this.color + ' ' + this.type + ' car';
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top