Compreender as ramificações de Pato digitado código

Compreender as ramificações de Pato digitado código

  

Problema Você quer entender para onde escrever melhor pato utilização e as questões que você deve estar ciente de quando usá-lo. Teoria, há uma diferença entre um tipo de valor e um tipo de referência em JavaScript. Mesmo para um tipo de referência, há uma diferença entre definir a referência como um valor ou uma referência pura. Mas se você ainda se preocupam com a diferença? É algo que você precisa estar ciente de? É quando você está tentando fazer algo específico. JavaScript é uma linguagem original que tem o tipo de pato, tipo latente, e as características do protótipo. Para criar um tipo de JavaScript, você pode definir o tipo de definição através de um protótipo, ou você pode definir os métodos e propriedades através da atribuição de uma instância de classe. Em geral, você tem a habilidade de dinamicamente fios juntos tipos em tempo de execução. Existem duas maneiras de implementar tipagem pato: tipos valor e tipos referência. Você precisa estar ciente de ambos os tipos, embora neste artigo Imostly valor de uso tipagem pato tipo. Não estou dizendo que um é melhor que o outro só que cada um tem vantagens e desvantagens. Os desenvolvedores tendem a escolher um sobre o outro com base em seus hábitos de programação. Por exemplo, eu prefiro pato valor escrevendo porque tenho tendência para serializar objetos para uso posterior. Solução Vamos atravessar um exemplo de pato digitação utilizando valores de referência. Considere o seguinte código, que é usado para criar uma função sem parâmetros que contém um estado.

 Fonte: / cliente / ajaxrestrecipes / javascript / valuevsreferencetypes.js função CallMeReference toCall (, value) (return function () (toCall (valor);))

No código anterior, a função CallMeReference tem dois parâmetros: toCall, que é uma função e valor, que é o estado usado para chamar a toCall função. A idéia por trás CallMeReference é criar uma função que não tem parâmetros, mas é chamado usando algum estado definido anteriormente. O código a seguir pode ser usado para executar um exemplo:

var func = CallMeReference (function (param) (info (param "é (" + param + ")");), "Olá mundo"); func ();

Neste exemplo, a variável função é usada para gerar um encapsulado "Olá mundo" mensagem. A variável de funções pode ser chamado várias vezes, ea mesma mensagem é gerada. A variável pode ser atribuído a outras variáveis, ea mesma mensagem será gerada. Porque nós somos programadores, vamos criar as funções que seguem o padrão Builder e precreate funções com determinados estados. Os dois seguintes funções de implementar o padrão Builder:

Version1Reference function () (return CallMeReference (function (param) (info ( "Ver é 1 (" + param + ")");), ➥ "Olá Mundo");) function Version2Reference () (return CallMeReference (function (param ) (info ( "Ver é 2 (" + param + ")");), ➥ "Olá Mundo");)

O Version1Reference e funções Version2Reference gerar funções com ligeiras diferenças. As funções resultantes gerados podem ser atribuídos a variáveis e, em seguida, chamado como no exemplo anterior. Até este ponto, tudo o que eu tenho mostrado é algo que você poderia fazer usando linguagens de programação tradicionais como C #, Java e C + +. Aqui, no entanto, estamos usando JavaScript, que implementa duck typing e protótipo baseado em recursos, o que significa que se uma função é atribuída a uma variável, não sabemos como aconteceu essa atribuição. Esta necessidade de saber quem fez o quê cessão não importa em C + +, C # ou Java, porque o programador definiu a ordem ea disposição dos tipos antes do tempo, e durante a execução dessa ordem não pode ser mudado. Em JavaScript, essa ordem não é definida antes do tempo é definida durante a execução. Por exemplo, o código a seguir é possível:

if (flag) (func = Version1Reference ();) else (func = Version2Reference ();)

Quando a função tem sido atribuída, não sei se foi atribuído usando o código da Version1Reference ou Version2Reference. Quando o código atribuído é executado, você pode logicamente determinar a partir do comportamento se o Version1Reference ou função Version2Reference foi usado. A razão de eu dizer que você não sabe qual o código foi atribuído é porque quando você serializar o funcionamento variável, o código a seguir é gerado:

function () (toCall (valor);)

O código gerado informa que as variáveis toCall eo valor tenha sido atribuído, mas você não sabe para quê. Isso pode se tornar problemática se você está tentando serializar um objeto que faz referência a função gerada. Se você serializar a função e tentar executar a função, um erro será gerado porque as variáveis toCall e valor não seria definido. Você pode serializar o estado dos membros de dados, mas os métodos de serialização causas estado para ser lost.For exemplo, imagine que você está escrevendo uma aplicação de hipoteca, e está actualmente a criar um cliente.

O cliente tem uma certa idade, endereço e perfil. Em um ambiente de programação tradicional, você deve associar o Estado com um objeto cada vez que o Estado está carregado. Isto significa que cada vez que o estado é carregado, você tem que executar várias implementações padrão Builder para criar o tipo de objeto adequado. Usando JavaScript, isso não é necessário porque o estado do objeto, incluindo os métodos, podem ser serializados. Isto torna possível para serializar um objeto completo, armazená-lo em um banco de dados, ou executá-lo em outro contexto. Funções dinâmicas necessidade de utilizar os tipos de valor, o que significa CallMeReference tem que ser modificada como segue:

função CallMeValue (toCall, value) (return eval ( "function () (var func =" + ➥ toCall.toString () + "; func ( '" + Value.ToString () + "');)");)

A função CallMeValue é como CallMeReference, exceto que ele serializa a função e valor para buffers seqüência de caracteres que são concatenados e executado. O resultado da execução é uma função que quando serializado gera a seguinte reserva:

function () (var func = function ((param) (info (param "é (" param + + ")");}); ➥ func ( "Olá Mundo");)

A função serializado se comporta exatamente como a função criada em CallMeReference, mas a função de valor pode ser serializado e executado em outro computador ou em outro contexto. Ao escrever o código que o código dinamicamente fios juntos, você precisa pensar sobre o uso de referência ou valor programação técnicas. Ao escrever tal código, considere as seguintes regras de ouro:

• pato tipos de referência devem ser considerados como tipos de transientes que vivem apenas para a extensão da execução de JavaScript (por exemplo, uma página HTML).

Tipos de pato • Referência são criados usando o padrão Builder.

• Uma vez criado, pato tipos de referência têm uma pequena vantagem de desempenho, já que não precisa a sobrecarga de executar a instrução eval na implementação do padrão Builder.

Tipos de pato • Referência podem compartilhar casos com múltiplas instâncias de objeto, porque você está atribuindo referências.

Tipos de pato • Valor deve ser considerada como a longo prazo Serializable objetos em que o estado eo código pode ser serializado.

Tipos de pato • Valor são criados usando o padrão Builder.

• pato tipos de valor são um pouco mais lento do que os tipos de pato de referência porque o código é o resultado da serialização, a construção de um tampão, e depois avaliar a reserva.

• Valor tipos de pato não tem o efeito colateral de ter funções se comportar de forma irregular por causa de instâncias de objeto atribuído. Cada chamada para um valor de pato tipo de resultados padrão Builder em uma abordagem rasa, onde as variáveis são atribuídas a determinado estado com o padrão Builder.

um artigo submetido por Sonja Lande


Isenção de responsabilidade:O nosso site não se responsabiliza pelo conteúdo deste artigo. Webarticles é uma fonte de informação livre.
Importante: Este artigo "Entender as ramificações de um pato digitado código" foi traduzida por um software automático. Nós sentimos muito por quaisquer erros de ortografia que pode ter ocorrido. Obrigado pela sua compreensão.


Online: 219 users browsing the articles directory