Pergunta

Existem algumas maneiras de obter comportamento semelhante a uma classe em javascript, a mais comum parece ser baseada em protótipo assim:

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 abordagens baseadas em fechamento semelhantes a

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

Por vários motivos, o último é mais rápido, mas eu vi (e frequentemente escrevo) a versão do protótipo e fiquei curioso para saber o que outras pessoas fazem.

Foi útil?

Solução

Atribuir funções ao protótipo é melhor (para métodos públicos) porque todas as instâncias da classe compartilharão a mesma cópia do método.Se você atribuir a função dentro do construtor como no segundo exemplo, toda vez que você criar uma nova instância, o construtor criará uma nova cópia da função de comprimento e a atribuirá apenas a essa instância.

No entanto, esta última técnica é útil se você querer cada cópia tenha sua própria cópia, sendo o principal uso disso para fazer métodos privados/privilégios que tenham acesso a variáveis ​​privadas declaradas dentro do construtor e herdadas através do mecanismo de fechamento.

Douglas Crockford tem um bom resumo.

Outras dicas

Há também a abordagem literal do objeto para o protótipo:

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

Felizmente consigo usar protótipo.js, que fornece alguns wrappers interessantes.Então você pode fazer isso:

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

Prototype.js Documentação:Definindo classes e herança

Bem, eu realmente não tenho uma opinião de especialista sobre isso.Normalmente acabo usando uma abordagem baseada em encerramentos apenas porque mantém o código mais simples de gerenciar.Porém, acabei usando protótipos para métodos que possuem muitas linhas de código.

Você também tem a opção de:

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

O que provavelmente é tão lento quanto o exemplo dois, mas se parece mais com Java/C# e é um pouco mais explícito.

Sou um grande fã de usar Biblioteca de John Resig por esta.Leve, direto e você já sabe como usá-lo se estiver familiarizado com o estilo 'normal' orientado a objetos.

Não há aulas em javascript.

Existem objetos, no entanto.Você não precisa de uma classe para criar um objeto em javascript.Ele possui funções construtoras que você pode invocar com new, por exemplo:

var james = new Person();

Você pode simular um comportamento semelhante ao de uma classe com:

exemplo de protótipo:

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

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

exemplo literal de objeto

var car = {
    type: "honda",
    color: "red",
    getInfo: function () {
        return this.color + ' ' + this.type + ' car';
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top