Why this Reference Error

Asked

Viewed 24 times

0

The method _validaFunção is in the same context as the create method, so why create returns a Uncaught ReferenceError: validaFuncao is not defined?

class ProxyFactory
{
    static _validaFuncao(funcao)
    {

        return typeof (funcao) === typeof (Function);
    }

    static create(objeto, itensObservados, acao)
    {
        return new Proxy(objeto,
            {
                get(alvo, propriedade, receptor)
                {
                    if ((itensObservados.includes(propriedade)) && (_validaFuncao(alvo[propriedade])))
                    {
                        return function ()
                        {
                            Reflect.apply(alvo[propriedade], alvo, arguments);
                            return acao(alvo);
                        }
                    }
                    return Reflect.get(alvo, propriedade, receptor);
                },
                set(alvo, propriedade, valor, reciever)
                {
                    if (itensObservados.includes(propriedade))
                    {
                        acao(alvo);
                    }
                    return Reflect.set(alvo, propriedade, valor, reciever);
                }
            });
    }
}

The if inside the create does not find the _validation

1 answer

1


You defined the method as static and a static method is only accessed directly in class, see:

class Estatica{
    static metodo(a) {
        return a + 1;
    }
}

//funciona, pois estou invocando o método diretamente da classe
console.log(Estatica.metodo(1));

//Não funciona, pois estou invocando atraves de uma instância do objeto
var est = new Estatica();
console.log(est.metodo(1));

With invocations within the class it would still be the same, see:

class Estatica{
    static metodo(a) {
        return a + 1;
    }
    
    static chamadaDiretaClasse(valor){
        return Estatica.metodo(valor);
    }
    
    static chamadaDiretaClasseThis(valor){
        return this.metodo(valor);
    }
    
    static chamadaDireta(valor){
        return metodo(valor);
    }
}

//Funciona, pois dentro de chamadaDiretaClasse o método é invocado através da classe
console.log(Estatica.chamadaDiretaClasse(1));

//Ainda funciona, pois o this dentro desse escopo se referencia a classe, então ele equivale a Estativa
console.log(Estatica.chamadaDiretaClasseThis(2));

//Não funciona, pois o um método estático não pode ser invocado dessa forma
console.log(Estatica.chamadaDireta(3));

So to solve your problem just add the class to which the method belongs _validaFuncao, that in your case would look like ProxiFactory._validaFuncao.

See more about

Browser other questions tagged

You are not signed in. Login or sign up in order to post.