27/10/2010 Development / java script

Duas maneiras de escrever classes. Eu venho utilizando bastante a primeira, mas de um tempo pra cá vou começar a dar mais enfase na segunda maneira, achei que fica mais organizado o código.

function Pessoa(){
    this.pessoas = [];
};
Pessoa.prototype.getNome = function(){
    return this.nome;
};
Pessoa.prototype.setNome = function(nome){
    this.nome = nome;
};
Pessoa.prototype.addPessoa = function(nome, idade, cod){
    var obj = {};
    obj.idade = idade;
    obj.nome = nome;
    obj.codEmpresa = cod;
    this.pessoas.push(obj);
};

function Empresa(){
    this.empresas = [];
};
Empresa.prototype = new Pessoa();
Empresa.prototype.addEmpresa = function(nome, cod){
    var obj = {};
    obj.nome = nome;
    obj.cod = cod;
    this.empresas.push(obj);
};
Empresa.prototype.funcionarios = function(cod){
    var func = [];
    for(var x = 0; x        if(this.pessoas[x].codEmpresa == cod){
            func.push(this.pessoas[x]);
        }
    }
    return func;
};

var Pessoa = {
    Class : function(){
        //get e setter ao mesmo tempo
        this.nome = function(n){ return n ? nome = n : nome; }
        this.idade = function(i){return i ? idade = i : idade;}
        this.codEmpresa = function(cd){return cd ? codEmpresa = cd : cd;}
        this.pessoas = [];
       
        this.addPessoa = function(nome, idade, cod){
            var obj = {};
            obj.idade = idade;
            obj.nome = nome;
            obj.codEmpresa = cod;
            this.pessoas.push(obj)
        }
           
        this.funcionarios = function(cod){
            var func = [];
            for(var x = 0; x                if(this.pessoas[x].codEmpresa == cod){
                    func.push(this.pessoas[x]);
                }
            }
            return func;
        }
    } //Fim da Class
};


var Empresa = {
    Class : function(){
        Pessoa.Class.apply(this); //Aplique Pessoa.Class na classe Empresa
        this.empresas = [];
       
        this.addEmpresa = function(nome, cod){
            var obj = {};
            obj.nome = nome;
            obj.cod = cod;
            this.empresas.push(obj);
        }
       
        this.funcionarios = function(cod){
            var func = [];
            for(var x = 0; x                if(this.pessoas[x].codEmpresa == cod){
                    func.push(this.pessoas[x]);
                }
            }
            return func;
        }
    } //Fim da Class
};


var e = new Empresa.Class();
e.addEmpresa('Xurupitas Inc', 10);
e.addPessoa('Huggler', 20, 10);
e.addPessoa('Hugo Tostes', 90, 10);
e.addPessoa('Luis Claudinho', 28, 10);

e.addEmpresa('Microsoft', 12);
e.addPessoa('Jack Bower', 20, 12);
e.addPessoa('Sandra Bullock', 90, 12);
e.addPessoa('Tais Araujo', 28, 12);

alert(e.funcionarios(10));

// ******************************************************

Trocando idéia com o Eduardo [ http://javiani.wordpress.com/ ], ele mandou a seguinte implementação:

var Interface = {
abstract :function(constructor){
if( this.constructor == constructor )
throw new Error(‘Classe abstrata não pode ser instanciada’)
}
}

var Organizacao = {

Class :function(){

Interface.abstract.apply( this, [Organizacao.Class] )

var data = { empresas :[], funcionarios :[] }

this.add = function(){
return this.add[ arguments.length ].apply( this, arguments )
}

this.add[2] = function(nome, codigo){
data.empresas.push({ nome :nome, codigo :codigo })
}

this.add[3] = function(nome, idade, codigo){
data.funcionarios.push({ nome :nome, idade :idade, codigo :codigo })
}

function get(type, codigo){
var ret = []
var search_for = data[ type ]
for(var i = 0; i < search_for.length; i++)
if( search_for[i].codigo == codigo)
ret.push(search_for[i])
return ret
}

this.get_funcionario = function(id){
return get('funcionarios', id)
}

this.get_empresa = function(id){
return get('empresas', id)
}

}

}

var Empresa = {
Class :function(){
Organizacao.Class.apply( this )

// Outros métodos
}
}

var e = new Empresa.Class

e.add('Google Inc', 10)
e.add('Felipe Huggler', 20, 10)
e.add('Hugo Tostes', 90, 10)
e.add('Luis Claudinho', 28, 10)
e.add('Microsoft', 12)
e.add('Jack Bower', 20, 12)
e.add('Sandra Bullock', 90, 12)
e.add('Tais Araujo', 28, 12);

console.log(e.get_funcionario(10));
console.log(e.get_empresa(10));