Ir para conteúdo
Fórum Script Brasil
  • 0

OOP em JavaScript


Vinicius Espindola

Pergunta

Pessoal,

Ultimamente, estou dando mais atenção especial sobre OOP em Javascript.

Tentei criar uma classe Pessoa, como mostra o código abaixo. No entanto, criei uma outra função "Start", cujo objetivo é demonstrar o que tem dentro no atributo "nome". Não quero deslocar esta função "Start" para dentro da "Class", apenas separado. No entanto, não entendo o porquê não estar funcionando dessa maneira e qual seria a sua solução.

Segue abaixo:

var Pessoa = {

 New : function(nome, idade){ return new this.Class(nome, idade) },

 Class : function( nome, idade ){

 this.nome = function(n){
 return n ? nome = n : nome
 }

 this.idade = function(i){
 return i ? idade = i : idade
 }

 },

Start: function() {
  alert(this.nome); 
 }

}
onde para instanciar, será:
var Edu = Pessoa.New("Eduardo Ottaviani", 25),
e para chamar o que tem na variável this.nome, será:
Pessoa.Start();

Como desejei separar "Start", após a classe, ao invés de criar uma função para dentro da "Class", eu não estou conseguindo expressar o resultado dessa maneira.

Podem me dar uma luz e tbém explicarem porque não funciona dessa maneira?

PS: a origem da dúvida foi em http://javiani.wordpress.com/2009/12/27/or...uages-patterns/ . Tentei postar um comentário lá, mas sempre está fora do ar.

Um abraço,

Vinicius.

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

O nome é uma variável local, e não uma propriedade do objeto, portando não deve ser referenciada com o this, já que this.nome é um método e a variável é apenas nome. Isto é, para acessar o valor desejado, você tem duas opções:

  • Chamar o método this.nome() sem nenhum parâmetro;
  • Acessar diretamente a variável nome (só funciona dentro da classe).
Além disso, não faz muito sentido que o método "Start" fique fora do objeto e o referencie com o this. Pode explicar melhor o que quer?

Quanto a postar no site, tem certeza que não está fazendo nada de errado? É possível também que o seu post tenha sido marcado para confirmação. Se não estiver conseguindo tente mandar uma mensagem para o Eduardo pelo fórum.

Link para o comentário
Compartilhar em outros sites

  • 0

Oi Jonathan,

Obrigado pela resposta. No entanto, vamos supor que, futuramente, o método "Start" precisa receber a variável local "nome", ou "x", ou "y", ou "qualquer coisa" da "Classe". Portanto, o meu objetivo é obter a informação do "nome", ou "x", ou "y", ou "qualquer coisa", para em seguida, providenciar o método do "Start". Teoricamente, tudo indica que deverei "extender" (herança) no "Start" à essa "Classe". Mas não sei se estou certo à esse ponto.

À principio, estou estudando diversas maneiras em como trabalhar OOP em JavaScript para, antes, eu decidir se será REALMENTE viável eu mudar a programação de JavaScript do meu projeto para OOP sem sofrer possíveis fortes dores de cabeça futuramente.

Atualmente, aplico OOP somente na linguagem PHP, o qual tenho profundo conhecimento em interagir diversas maneiras (Interface, Polimorfismo, Herança, Constante, Abstrato, etc).

No mais, obrigado desde já, Jonathan.

Um abraço,

Vinicius.

Link para o comentário
Compartilhar em outros sites

  • 0
Vamos supor que, futuramente, o método "Start" precisa receber a variável local "nome", ou "x", ou "y", ou "qualquer coisa" da "Classe". Portanto, o meu objetivo é obter a informação do "nome", ou "x", ou "y", ou "qualquer coisa", para em seguida, providenciar o método do "Start". Teoricamente, tudo indica que deverei "extender" (herança) no "Start" à essa "Classe". Mas não sei se estou certo à esse ponto.

Cuidado com os conceitos de OO. No js, não existe formalmente a OO, mas, funciona do mesmo jeito como no PHP, com algumas possibilidades a mais e outras a menos.

No entanto. A única coisa que não consegui implementar no js é colocar um atributo, ou um método, static e private ao mesmo tempo. O resto tem como fazer numa boa.

Toda função no js é um construtor

function Class(){ //ou Class = function(). Tudo em js, é propriedade
    //atributo privado
    var att1 = 'private att'
    //atributo público
    this.att2 = 'public att'
    this.method = function(){
        //...
    }
}

var cls = new Class();
alert(cls.att1) //undefined
alert(cls.att2) //public att
Mas, a forma json(javascript object notation) é a melhor forma de se trabalhar com objeto no js. Eu só tenho uma dúvida. Se não existe formalmente OO no js, porque existe as palavras reservadas, class, interface, ... no mesmo? É importante falar ainda que, nessa forma (json), podemos ter vários construtores. No js, um construtor, para ser um construtor, deve ter atributos.
Class = {
    construct:function(){
        var att1 = 'private att'
        this.att2 = 'public att'
    },

    staticAtt: null,

    //repare que o último não precisa de vírgula ao final
    staticMethod:function(){
        alert('public static method')
    }

}

//acessando classe
alert(Class.staticMethod())
Class.staticAtt = 'public static att'
var cls = new Class.construct()
//acessando objeto
alert(cls.att2)
//repare que é static mesmo, o new não muda o valor de "staticAtt", visto que não faz parte do objeto, mas da classe
alert(Class.staticAtt)
Para extender uma classe no js, use o método call:
Children = {
    //chama a  classe, a qual deseja-se extender, aqui. Inclusive, pode-se ainda, fazer overhides em métodos
    Father.cls.call(this) //Deve ficar dentro de um construtor, pois a classe pode ter vários
    ...
}
Nunca testei, mas diferente do PHP, o js da suporte a herança múltipla com este método call (this, Class1, Class2, Class3) ... Para dar a idéia de construtor privado ou de abstração
Class = {

    cls : function(){
        if (this.constructor == Class.construtor.prototype.constructor)
            //Para o processamento do script
            throw 'isn\'t constructor'
    }
}
Com o throw, podemos usar a idéia de interface, obrigando a todos o overhide em todos os métodos. Veja.
Interface = {

    cls : function(){
        if (this.constructor == Class.construtor.prototype.constructor)
            //Para o processamento do script
        //Força ao programador implementar o "method"
        this.method = function(){
            throw 'Implement method';
        }
    }

}

Qualquer coisa posta aew.

Editado por Rafael Laurindo
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...