Tenho uma função a()
que desejo substituir, mas também o original deve a()
ser executado em uma ordem, dependendo do contexto. Por exemplo, às vezes, quando estou gerando uma página, quero substituir dessa forma:
function a() {
new_code();
original_a();
}
e às vezes assim:
function a() {
original_a();
other_new_code();
}
Como faço para obter isso original_a()
de dentro do controle a()
? Isso é possível?
Por favor, não sugira alternativas para ultrapassar dessa maneira, eu sei de muitas. Estou perguntando sobre esse caminho especificamente.
(functi..
e})
. Fazer}();
isso produziria o mesmo resultado, pois o(function{})()
primeiro conjunto de parênteses é usado porque você não pode simplesmente declarar, anônima, a expressão da função que precisa atribuir. Mas ao fazer () você não está definindo nada, apenas retornando uma função.a
, sem chamá-la e armazenando o valor de retorno. Os parênteses me avisam que há algo mais acontecendo.O padrão Proxy pode ajudá-lo a:
fonte
Obrigado pessoal, o padrão de proxy realmente ajudou ..... Na verdade, eu queria chamar uma função global foo. Em determinadas páginas, preciso fazer algumas verificações. Então eu fiz o seguinte.
Thnx isso realmente me ajudou
fonte
org_foo(args)
, chameorg_foo.call(this, args)
. Isso mantémthis
como teria sido quando o window.foo chama normalmente (sem proxy). Veja esta respostaVocê pode substituir uma função usando uma construção como:
Por exemplo:
Editar: corrigido um erro de digitação.
fonte
Passando argumentos arbitrários:
fonte
original_a
embora?A resposta que @Matthew Crumley fornece é usar as expressões de função invocadas imediatamente, para fechar a função 'a' mais antiga no contexto de execução da função retornada. Eu acho que essa foi a melhor resposta, mas pessoalmente, eu preferiria passar a função 'a' como argumento para o IIFE. Eu acho que é mais compreensível.
fonte
Os exemplos acima não se aplicam
this
ou passamarguments
corretamente para a substituição da função. Sublinhado _.wrap () agrupa as funções existentes, aplicathis
e passaarguments
corretamente. Veja: http://underscorejs.org/#wrapfonte
Eu tinha algum código escrito por outra pessoa e queria adicionar uma linha a uma função que não consegui encontrar no código. Então, como solução alternativa, eu queria substituí-lo.
Nenhuma das soluções funcionou para mim.
Aqui está o que funcionou no meu caso:
fonte
Eu criei um pequeno auxiliar para um cenário semelhante, porque muitas vezes precisava substituir funções de várias bibliotecas. Esse auxiliar aceita um "espaço para nome" (o contêiner da função), o nome da função e a função de substituição. Ele substituirá a função original no espaço para nome referido pelo novo.
A nova função aceita a função original como o primeiro argumento e os argumentos das funções originais como o restante. Ele preservará o contexto sempre. Ele também suporta funções nulas e não nulas.
Uso, por exemplo, com o Bootstrap:
Eu não criei nenhum teste de desempenho. Possivelmente, pode adicionar uma sobrecarga indesejada que pode ou não ser um grande problema, dependendo dos cenários.
fonte
Na minha opinião, as principais respostas não são legíveis / mantidas e as outras respostas não vinculam adequadamente o contexto. Aqui está uma solução legível usando a sintaxe ES6 para resolver esses dois problemas.
fonte
Portanto, minha resposta acabou sendo uma solução que me permite usar a variável _está apontando para o objeto original. Eu crio uma nova instância de um "Quadrado", no entanto, odiava a maneira como o "Quadrado" gerava seu tamanho. Eu pensei que deveria seguir minhas necessidades específicas. No entanto, para fazer isso, eu precisava que o quadrado tivesse uma função "GetSize" atualizada com os internos dessa função chamando outras funções já existentes no quadrado, como this.height, this.GetVolume (). Mas, para fazer isso, eu precisava fazer isso sem nenhum truque maluco. Então aqui está a minha solução.
Alguma outra função inicializadora de objeto ou auxiliar.
Função no outro objeto.
fonte
Não tenho certeza se funcionará em todas as circunstâncias, mas, no nosso caso, estávamos tentando substituir a
describe
função no Jest para poder analisar o nome e pular tododescribe
bloco se ele atender a alguns critérios.Aqui está o que funcionou para nós:
Duas coisas que são críticas aqui:
Nós não usamos uma função de seta
() =>
.As funções de seta alteram a referência
this
e precisamos que seja o arquivothis
.O uso de
this.describe
e emthis.describe.skip
vez de apenasdescribe
edescribe.skip
.Novamente, não tenho certeza se é de valor para alguém, mas originalmente tentamos nos safar da excelente resposta de Matthew Crumley, mas precisávamos tornar nosso método uma função e aceitar parâmetros para analisá-los na condicional.
fonte