Passei as últimas duas horas tentando encontrar uma solução para o meu problema, mas parece sem esperança.
Basicamente, preciso saber como chamar um método pai de uma classe filho. Todas as coisas que eu tentei até agora acabam não funcionando ou substituindo o método pai.
Estou usando o seguinte código para configurar o OOP em javascript:
// SET UP OOP
// surrogate constructor (empty function)
function surrogateCtor() {}
function extend(base, sub) {
// copy the prototype from the base to setup inheritance
surrogateCtor.prototype = base.prototype;
sub.prototype = new surrogateCtor();
sub.prototype.constructor = sub;
}
// parent class
function ParentObject(name) {
this.name = name;
}
// parent's methods
ParentObject.prototype = {
myMethod: function(arg) {
this.name = arg;
}
}
// child
function ChildObject(name) {
// call the parent's constructor
ParentObject.call(this, name);
this.myMethod = function(arg) {
// HOW DO I CALL THE PARENT METHOD HERE?
// do stuff
}
}
// setup the prototype chain
extend(ParentObject, ChildObject);
Preciso chamar o método dos pais primeiro e depois adicionar mais algumas coisas na classe filho.
Na maioria das linguagens OOP, isso seria tão simples quanto chamar. parent.myMethod()
Mas eu realmente não consigo entender como isso é feito em javascript.
Qualquer ajuda é muito apreciada, obrigado!
fonte
ParentClass.prototype.myMethod.apply() or
ParentClass.prototype.myMethod.call () `, como faz com seu construtor.ParentClass.prototype.myMethod.call(this, arg1, arg2, arg3...);
)myMethod
aula.O estilo ES6 permite usar novos recursos, como
super
palavra-chave.super
A palavra-chave trata-se do contexto da classe pai, quando você usa a sintaxe das classes ES6. Como um exemplo muito simples, faça o checkout:Além disso, você pode usar
super
para chamar o construtor pai:E é claro que você pode usá-lo para acessar as propriedades da classe pai
super.prop
. Então, use o ES6 e seja feliz.fonte
super
ser chamado? Existe uma equivalência no JS "antigo"?super()
em métodos estáticos; parece que você o usou no construtor.Bem, para fazer isso, você não está limitado à
Class
abstração do ES6. O acesso aos métodos de protótipo do construtor pai é possível por meio da__proto__
propriedade (tenho certeza de que haverá outros codificadores JS para reclamar que estão depreciados), o que está depreciado, mas ao mesmo tempo descobriu que é realmente uma ferramenta essencial para as necessidades de subclasses ( especialmente para as necessidades de subclassificação de matriz). Portanto, embora a__proto__
propriedade ainda esteja disponível em todos os principais mecanismos JS que eu conheço, o ES6 introduziu aObject.getPrototypeOf()
funcionalidade em cima dela. osuper()
ferramenta noClass
abstração é um açúcar sintático disso.Portanto, caso você não tenha acesso ao nome do construtor pai e não queira usar a
Class
abstração, você ainda pode fazer o seguinte;fonte
No caso de múltiplos níveis de herança, essa função pode ser usada como um método super () em outros idiomas. Aqui está um violino demo , com alguns testes, você pode usá-lo assim, dentro do seu método use:
call_base(this, 'method_name', arguments);
Utiliza funções ES muito recentes, não é garantida uma compatibilidade com navegadores mais antigos. Testado em IE11, FF29, CH35.
fonte
Que tal algo baseado na ideia de Douglas Crockford:
fonte
Aqui está uma boa maneira de os objetos filhos terem acesso às propriedades e métodos pai usando a cadeia de protótipos do JavaScript e é compatível com o Internet Explorer. O JavaScript pesquisa métodos na cadeia de protótipos e queremos que a cadeia de protótipos da criança tenha a seguinte aparência:
Instância filho -> Protótipo do filho (com métodos filho) -> Protótipo do pai (com métodos pai) -> Protótipo de objeto -> nulo
Os métodos filho também podem chamar métodos pai sombreados, conforme mostrado nos três asteriscos *** abaixo.
Aqui está como:
fonte
Existe uma solução muito mais fácil e compacta para a pesquisa de protótipos em vários níveis, mas requer
Proxy
suporte. Uso:SUPER(<instance>).<method>(<args>)
, por exemplo, assumindo que duas classesA
eB extends A
com métodom
:SUPER(new B).m()
.fonte
Enquanto você pode chamar o método pai pelo protótipo do pai, você terá de passar a instância criança atual para usar
call
,apply
oubind
método. obind
método criará uma nova função, portanto, não recomendo que se você se preocupa com o desempenho, exceto se ele for chamado apenas uma vez.Como alternativa, você pode substituir o método filho e colocar o método pai na instância enquanto chama o método filho original.
fonte