A sintaxe da OLP em js e o uso de prototype

O que são estas pedaços de código e que em alguns casos será preferível?



A


function Obj() {}
Obj.method = function(type) {
    return this.coords[type];
};
var obj = new Obj(),
    current = obj.method(type);




B


function Obj() {}
Obj.prototype.method = function(type) {
    return this.coords[type];
};
var obj = new Obj(),
    current = obj.method(type);




C


var obj = {
    method : function(type) {
        return this.coords[type];
    }
},
    current = obj.method(type);




D


function objMethod(type){
    return this.coords[type];
}
var obj = {
    method : objMethod
},
    current = obj.method(type);



added @ 1732:

E


function Obj() {
    this.method = function(type) {
        return this.coords[type];
    };
}
var obj = new Obj(),
    current = obj.method(type);


Answers 5:

Share:


Pretty Players Vlogs
Answer 1

JS — uma linguagem orientada a objetos, mas não há classes, eles substituem os construtores de objetos, de modo que, em vez de um de herança através de classes existe a herança através de protótipos. Т. е. uma instância de uma classe herda as propriedades e métodos, que estão em seu protótipo.
O construtor da classe (function Obj() {}) — função, que descreve as propriedades e métodos de um protótipo, portanto, a todas elas terá acesso ao criar a instância.

No exemplo A um construtor vazio, e Obj.method define o método de um objeto, e não o seu protótipo, portanto, ele não será herdada em obj = new Obj(). Este exemplo não funciona.

Exemplo B — certo, aqui o método de método de entrada é adicionada ao protótipo e será herdada por todas as instâncias.

Um exemplo de C é usado com mais freqüência quando a necessidade de implementar um singleton ou namespace, porque é simples de hash, sem design, não pode herdar. Na verdade não é um objeto em OOP compreensão, mas simplesmente um array associativo, que podem conter qualquer tipo de dados, métodos e outros objetos.

Exemplo D é semelhante ao exemplo C, só ele tem a propriedade de método de entrada contém uma referência externa para a função. Este exemplo pode ser usado quando você precisa de causar algum tipo de função a partir do exterior da biblioteca.

Um exemplo E o correto, e é semelhante ao exemplo B, com a diferença de que herda o método é definido diretamente no construtor, e não através do prototype.


Honey Miles
Answer 2

Bem, na verdade, a diferença entre B e e, há, no caso, E, quando um método é declarado diretamente no construtor, ele vai ter acesso aos variáveis e métodos, que é chamado de privilegiados os métodos, mas no exemplo B, não há a possibilidade de trabalhar com dados confidenciais.
E é sobre isso que eu digo:

var MyClass = function() {
  // Atributos privados
  var _a, _b;
  // Método privado
  function _myPrivate(isbn) {
}
  // público privilegiado o método
  this.MyPublicPlus = function() {

};
}

// público непривилегированный método.
MyClass.prototype = {
MyPublic: function() {
}
};


O método MyPublicPlus terá acesso ao _a, _b e _myPrivate(), e MyPublic não...


浅井智子
Answer 3

Em geral, todo mundo que está interessado em saber como funciona o Javascript, aconselho a ler www.crockford.com/javascript/javascript.html


james swan
Answer 4

No exemplo, E ainda vale a pena prestar atenção à palavra this, o que significa que o método será adicionado em um protótipo.
Se não usá-lo, você pode criar private-propriedades e métodos, que estarão disponíveis a partir de outros métodos de instância, mas não diretamente.

function Obj() {
    var privateMethod = function(x) {
        return x;
    }
    this.publicMethod = function(x) {
      return privateMethod(x); 
   }
}
var obj = new Obj();
obj.privateMethod(1); // -> вызовет ошибку
obj.publicMethod(1); // -> вернет '1'


Joe Amadeo
Answer 5

A, B, E possui um construtor de Obj. no caso de uma chamada a função através de new — o designer irá trabalhar com um novo objeto, no caso de uma chamada através de um call/apply vai expandir a determinado objeto de Você. т. е. uma função pode ser "classe" e "mistura".
C, D — criar um objeto com as mãos", sem estrutura. em D o recurso apresentado e проименована — implícito, que pode ser usada não apenas como um método.
B — usado prototipagem rápida. o protótipo tem cada objeto*, isso significa que непримитивные tipos de dados (funções, matrizes, data, objetos) que serão armazenados apenas no protótipo, economizando memória e o tempo "criação" de um objeto, mas diminuindo o acompanhamento com um objeto devido ao fato de que o apelo ao "comum" dados/métodos ocorrerá através de (cadeia) de protótipos.
A função também é um objeto, e o "método" é designada por função de objeto. a função de um objeto (designer) não tem nada a ver com alterações de vulnerabilidade objetos. объет de design — é um bom lugar para o lixo, que não querem distribuir em todas as suas instâncias".

um par de momentos, que deve compreender:

function Obj() {} 
Obj.prototype.q = [1,2,3]; 
var obj = new Obj(); 
Obj.prototype.q[1] = 8; 
alert(obj.q +" - "+ Obj.prototype.q); // 1,8,3 - 1,8,3 

function Obj() { 
 this.val = 5; 
 this.method = function() { alert(this.val *2); }; 
}; 
var obj = new Obj(); 
window.setTimeout(obj.método de entrada, 1); // NaN 


ler:
ru.wikipedia.org/wiki/Прототипное_программирование
* dklab.ru/chicken/nablas/40.html — .constructor.prototype; onde lá foi a explicação da necessidade de definir conctructor protótipo no "atual" classe
www.webreference.com/js/column26/apply.html — apply-impureza
assim recomendo a googlar sobre todos os tipos de typeof, instanceof, hasOwnProperty, isPrototypeOf, etc.

em que proporção usar protótipos, circuito, impurezas e outras construções — é só o Seu estilo.