1
resposta

Dúvida sobre herança JavaScript

Estou praticando um pouco e me deparei com este problema. Neste script tenho duas funções (account e savingsAccount) gerando objetos distintos que representam dois tipos de contas diferentes em um banco. Ambas funções têm as mesmas propriedades, com uma única diferença: a forma com que o método deposit é implementado. Como savingsAccount herda as propriedades e métodos de account, eu sobrescrevi o método deposit usando prototype, segue o código:

'use strict';

function account(name) {
    this.name = name;
    this.balance = 0;
    this.deposit = function (value) {
        (value > 0) ? this.balance +=  5 + value : false; 
    }
}

function savingsAccount(name) {
    account.call(this, name);
}

savingsAccount.prototype.deposit = function(value) {
    (value > 0) ? this.balance = value : false;
}

const joao = new savingsAccount('João');
joao.deposit(5); // retorna 10,  5 era o esperado

Como visto acima, o resultado esperado era 5 porém ele retorna 10, ou seja, o objeto está usando o método deposit de account e não o que foi definido no prototype de savingsAccount. Alguém pode me explicar o por quê? Propriedades herdadas não podem ser sobrescritas?

1 resposta

Então cara...

Da forma que foi ensinado no curso, o prototype foi usado para atribuir um novo método à um objeto que já foi criado, alterando o "protótipo" do objeto.

Não tenho certeza se é possível, de alguma forma, sobrescrever um método herdado por um objeto, usando prototype. Até pq, ao invés de sobrescrever um método herdado, para realizar uma tarefa; você pode usar o prototype para criar um novo método, com um nome diferente do método herdado, e ter basicamente o mesmo resultado. No seu código, seria algo assim:

savingsAccount.prototype.deposit2 = function(value) { 
    (value > 0) ? this.balance = value : false;
}

const joao = new savingsAccount('João');


joao.deposit2(5);  // assim, retorna 5

Porém, se você quer sobrescrever o método herdado, pode fazer assim:

function savingsAccount(name, balance) {
    account.call(this, name, balance);
    this.deposit = function(value) {
        (value > 0) ? this.balance = value : false;
    }
}

const joao = new savingsAccount('João');

joao.deposit(5); 
console.log(joao) // retorna 5

Espero ter ajudado! : )