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

(Resolvido) Dúvida sobre escopo do prototype


Rafael Laurindo

Pergunta

O prototype, só pode ser usado fora da classe para implementar uma classe, ou poderia implementar, usando o prototype de outra classe?

Exemplo:

Motor = {
      Interface : function()
      {
          this.acelerar = function(valor){}
      }
  }
  
  function Carro()
  {
      Motor.Interface.call(this)
      //implementação do método acelerar da interface motor
      Motor.Interface.prototype.acelerar = function(valor)
      {
          return valor += 10
      }
  }
  
  function test()
  {
      var carro = new Carro()
      alert(carro.acelerar(10))
  }

O que está errado?

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

Posts Recomendados

  • 0

Supondo que o prototype fosse aplicado aí, ele iria valor para TODAS as classes que utilizam a interface, ou seja, se você tivesse uma classe "Moto" que utilizasse a interface "Motor", o método "acelerar" estaria igual ao que foi setado na classe "Carro".

Mas ele não é aplicado pelos seguintes motivos:

  • O prototype pode inserir métodos, mas não alterar
  • Faltou o "=function()" ali

Se o que você quer é implementar o método acelerar derivado da interface Motor na classe Carro (e somente nessa classe), pode fazer assim:

function Carro()
{
    Motor.Interface.call(this)
    //implementação do método acelerar da interface motor
    this.acelerar=function(valor)
    {
        return valor += 10
    }
}

Creio que deve funcionar. Qualquer coisa posta aí !

Link para o comentário
Compartilhar em outros sites

  • 0

Mas e se eu não usasse o prototype? A resposta está sendo "undefined".

Motor = {
    Interface : function()
    {
        this.acelerar = function(valor){}
    }
}

function Carro()
{
    Motor.Interface.call(this)
    //implementação do método acelerar da interface motor
    Motor.Interface.acelerar = function(valor)
    {
        return valor += 10
    }
}

function test()
{
    var carro = new Carro()
    alert(carro.acelerar(10))
}

Resolveria também, ou ia setar para outra classe também, por exemplo Moto?

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

  • 0
Ou o objetivo é realmente modificar a ação do método em todas as classes?

Não. Seria o caso da idéia de interface mesmo. Isso seria herança de comportamento. Eu já havia discutido sobre isso antes, mas eu aprendi o contrário com o kakaroto, eu aprendi a implementar a interface, nesse caso, outras classes usariam esse mesmo método implementado, não podendo sobrecarrega-lo. Eu poderia fazer essa última idéia com o prototype, certo?

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

  • 0

A sim, isso seria a sobrecarga? Esse eu já testei. Funciona. Esse é uma coisa lógica, e de fácil compreensão para mim. Só que Motor tem a ver com carro, mas a recíproca nesse caso não é verdadeira, por isso a dúvida. Se eu tentasse usar Motor, eu não poderia usar acelerar em outra classe.

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

  • 0

Eu queria saber se isso que implementou é uma pseudaSobrecarga? Caso seja, deixa eu perguntar outra coisa. Se eu quisesse implementar o código para acelerar sem sofrer sobrecarga, claro, eu poderia fazer daquela forma, com o prototype mesmo, na classe Carro. Porque, estou fazendo o seguinte código:

//Heranca -> Class.call(this)
function Veiculo()
{    
    this.freiar = function(valor)
    {
        return valor -= 10
    }
}

//Interface
Motor = {    
    Interface : function()
    {
    this.acelerar = function(valor){//throw}
    }
}

//Carro é um veículo
function Carro()
{
    Veiculo.call(this)
    Motor.Interface.call(this)
    //implementação de um método em Motor
    Motor.Interface.prototype.acelerar = function(valor)
    {
        return valor += 10
    }/**/
    //Carro terá acesso a Veículo, mas a recíproca não é verdadeira
    var tracao=null //private
}

function Moto()
{
    Veiculo.call(this)
}

function teste()
{
    var carro = new Carro()
    alert(carro.acelerar(0))//a resposta é carro.acelerar is not a function
    alert(carro.freiar(20)) //10
}

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

  • 0

Entendi, muito obrigado. Bom. Você pode ver o que está errado com esse código, já que ele retorna carro.acelerar(0) is not a function.

Motor = {
    Interface : function() {}
}

function Carro()
{
    Motor.Interface.call(this)
    Motor.Interface.prototype.acelerar = function(valor)
    {
        return valor += 10
    }/
    var tracao=null //private
}

function Implements()
{
    var carro = new Carro()
    alert(carro.acelerar(20))
}

Link para o comentário
Compartilhar em outros sites

  • 0

No código que você fez, o que (provavelmente) ocorre é o seguinte:

Na primeira vez que é instanciado um objeto da classe "Carro", ele herda da classe "Motor" e depois implementa o método (ou seja, no momento em que ele herda de "Motor", o método ainda não existe). Além disso, supondo que você tivesse um objeto da classe "Moto" que foi criado antes de instanciar um da classe "Carro", o método não terá sido implementado.

Eu acho que é isso. Tente fazer o teste.

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...