É possível chamar o método base a partir de um método protótipo em JavaScript, se ele tiver sido substituído?
MyClass = function(name){
this.name = name;
this.do = function() {
//do somthing
}
};
MyClass.prototype.do = function() {
if (this.name === 'something') {
//do something new
} else {
//CALL BASE METHOD
}
};
javascript
prototype
overriding
markvpc
fonte
fonte
Respostas:
Eu não entendi o que exatamente você está tentando fazer, mas normalmente a implementação de comportamento específico de objeto é feita nessas linhas:
fonte
Bem, uma maneira de fazer isso seria salvar o método base e depois chamá-lo a partir do método substituído, assim
fonte
_do_base
armazena uma referência a qualquer função que foi definida anteriormente. Se não houvesse, então seriaundefined
. O JavaScript não é - asmake
expressões nunca são avaliadas preguiçosamente como você sugere. Agora, se o protótipo herdado de também usou _do_base para armazenar o que ele acha que é a implementação de seu tipo basedo
, você tem um problema. Portanto, sim, um fechamento seria uma maneira melhor e segura de herança para armazenar a referência à implementação da função original se você usar esse método - embora isso exija o usoFunction.prototype.call(this)
.Receio que seu exemplo não funcione da maneira que você pensa. Esta parte:
substitui a definição de
Como o objeto recém-criado já possui uma propriedade "do", ele não pesquisa a cadeia de protótipos.
A forma clássica de herança em Javascript é difícil e difícil de entender. Eu sugeriria usar o padrão simples de herança de Douglas Crockfords. Como isso:
Na minha opinião, uma maneira muito mais clara de lidar com objetos, construtores e herança em javascript. Você pode ler mais em Crockfords Javascript: The good parts .
fonte
base_do
como uma função, porque você perde qualquerthis
ligação nodo
método original dessa maneira. Portanto, a configuração do método base é um pouco mais complexa, especialmente se você quiser chamá-lo usando o objeto base como emthis
vez do objeto filho. Eu sugeriria algo parecidobase_do.apply(me, arguments)
.var
parabase_do
? Isso é de propósito e, se sim, por quê? E, como disse o GiulioPiancastelli, isso quebra athis
ligaçãobase_do()
ou a chamada herdará athis
do chamador?var
deveria estar lá. Usarcall
(ouapply
) nos permite vincularthis
corretamente.Eu sei que este post é de 4 anos atrás, mas por causa do meu background em C #, eu estava procurando uma maneira de chamar a classe base sem precisar especificar o nome da classe, mas obtê-lo por uma propriedade na subclasse. Então, minha única mudança na resposta de Christoph seria
Disto:
Para isso:
fonte
this.constructor
nem sempre pode apontarMyClass
.se você definir uma função como esta (usando OOP)
existem duas maneiras de chamar uma função de protótipo: 1) criar uma instância e chamar a função de objeto:
e a outra maneira é ... 2) está chamando a função diretamente do protótipo:
fonte
Esta solução usa
Object.getPrototypeOf
TestA
é super que temgetName
TestB
é um filho que substituigetName
, mas que tambémgetBothNames
chama asuper
versãogetName
e achild
versãofonte
fonte
Uma alternativa :
fonte
__proto__
(que altera o [[Protótipo]] `de um objeto) deve ser evitado. Por favor, use aObject.create(...)
rota.Se bem entendi, você deseja que a funcionalidade Base seja sempre executada, enquanto uma parte dela deve ser deixada para implementações.
Você pode ser ajudado pelo padrão de design do ' método de modelo '.
fonte
Se você conhece sua super turma pelo nome, pode fazer algo assim:
Isso imprimirá
como esperado.
fonte
Outra maneira com o ES5 é atravessar explicitamente a cadeia de protótipos usando
Object.getPrototypeOf(this)
fonte
Não, você precisaria dar a função do no construtor e a função do nos nomes diferentes do protótipo.
fonte
Além disso, se você deseja substituir todas as instâncias e não apenas uma instância especial, essa pode ajudar.
resultado:
fonte
fonte