Na programação orientada a objetos, muitas linguagens suportam a sobrecarga da função e podem fazer operações diferentes de acordo com diferentes números e tipos de parâmetros passados pela função. No entanto, o JS não o suporta, por isso precisamos fazer algumas ações extras pequenas.
No contexto de execução da função JS, há uma variável interessante chamada argumentos. Ele armazena todos os parâmetros passados durante a execução da função na forma de uma matriz, mesmo que a definição da função não defina tantos parâmetros formais. Outro recurso especial é que, em comparação com o tipo de matriz, a variável de argumentos tem e possui apenas um atributo de comprimento. Métodos de matriz, como push, pop, etc., não o têm. É apenas um "pseudo-gray": possui um atributo de comprimento, e a matriz armazenada pode ser acessada pelo caractere de acesso à matriz [] e é somente leitura e não pode ser escrito.
1. Sobrecarga de números diferentes
Deve estar muito claro aqui que você pode usar o atributo de comprimento da função de argumentos para julgar.
A cópia do código é a seguinte:
<script type = "text/javascript">
Function Talk (msg, manipulador) {
var len = argumentos.Length;
// executar ao passar um parâmetro
if (len == 1) {
alerta ("Função diz:"+msg);
}
// execute quando dois parâmetros são passados
else if (len == 2) {
manipulador (msg);
}
}
conversa ("demonstração");
Talk ("Demo", function (w) {alert ("Handler diz:"+w);});
</script>
2. Sobrecarga de diferentes tipos de parâmetros
Para uma linguagem tipada dinamicamente como JS, a natureza arbitrária das declarações variáveis minimiza a importância de tipos rígidos de variáveis nas mentes dos desenvolvedores (PS: também baseados no sistema ECMA, como introduz os tipos obrigatórios de declarações variáveis). Muitos bugs inesperados são realmente causados pela conversão automática desse tipo de variável. De fato, o JS fornece um método muito preciso para detectar estritamente os tipos de variáveis. Os mais comuns são o método tipo de atributo e construtor.
1. O tipo de variável retorna o tipo de variável
A cópia do código é a seguinte:
temp = "diga"; //corda
temp = 1; //número
temp = indefinido; //indefinido
temp = nulo; //objeto
temp = {}; //objeto
temp = []; //objeto
temp = true; // booleano
temp = function () {} // função
alerta (tipo de temperatura);
Através do teste acima, você pode ver que, para NULL, Object e Array, todos retornam tipos de objetos, e o uso do método a seguir pode resolver esse problema.
2. O atributo de concorrência detecta o tipo de variável
Cada objeto no JS possui um atributo construtor, usado para referenciar a função que constrói esse objeto. Ao julgar essa referência, os tipos de variáveis podem ser detectados.
A cópia do código é a seguinte:
temp = "diga";
temp.Constructor == String; //verdadeiro
temp = {};
temp.Constructor == Object; // true
temp = [];
temp.Constructor == Array; // true
Através do teste acima, é fácil distinguir entre variáveis de matriz e tipo de objeto. Vamos testar o objeto personalizado para ver o que acontece.
A cópia do código é a seguinte:
// objeto personalizado
function ball () {}
// instanciar um objeto
var basquete = nova bola ();
basquete.Constructor == Ball; //verdadeiro
Isso pode indicar que o atributo construtor também é aplicável a objetos personalizados.
Depois de entender a aplicação dos dois métodos acima, vamos retornar à simulação da sobrecarga da função JS. O exemplo a seguir está sobrecarregando de acordo com o tipo de parâmetro.
A cópia do código é a seguinte:
Função Talk (msg) {
var t = tipo de msg;
if (t == "string") {
alerta ("é uma string");
}
caso contrário, se (t == "número") {
alerta ("é um número");
}
}
conversa (10); // é uma string
conversa ("demonstração"); // é um número
Anexado é uma função muito inteligente que detecta estritamente os tipos e números de parâmetros:
A cópia do código é a seguinte:
// Verifique estritamente o tipo de uma lista de variáveis com base na lista de parâmetros
função rigorosa (tipos, args) {
// Verifique se o número de número e tipo de parâmetros corresponde
if (type.length! = args.length) {
// Se o comprimento não corresponder, uma exceção será lançada
lançar "Número inválido de argumentos. Esperado" + tipos.length + ", recebido" + args.length + "em vez disso.";
}
// viaje por cada parâmetro e verifique o tipo de base
for (var i = 0; i <args.length; i ++) {
// Se um certo tipo de javascript não corresponder, uma exceção será lançada
if (args [i] .Constructor! = Tipos [i]) {
lançar "tipo de argumento inválido.
}
}
}
// Uso do método acima
função dofunction (id, nome) {
// detecta o número e o tipo de parâmetros
rigoroso ([número, string], argumentos);
..
}