Tipo de referência
Os tipos de referência incluem principalmente: tipo de objeto, tipo de matriz, tipo de data, tipo regexp, tipo de função, etc.
Quando os tipos de referência são usados, um objeto (instância) precisa ser gerado a partir deles. Em outras palavras, um tipo de referência é equivalente a um modelo. Quando queremos usar um determinado tipo de referência, precisamos usar esse modelo para gerar um objeto para uso, para que o tipo de referência seja chamado de definição de objeto.
Por exemplo, precisamos gerar um objeto de pessoa para definir a informação e o comportamento pessoais de alguém, por isso precisamos confiar no tipo de objeto:
var pessoa = new Object (); pessoa.name = "jiangshui"; pessoa.sayname = function () {console.log (this.name);}O objeto de pessoa acima é definido pelo "modelo" usando o novo operador usando o tipo de objeto. Depois disso, você pode adicionar o nome do atributo e o método SayName a este objeto. Propriedades e métodos são "funções" dos tipos de objetos; portanto, objetos criados através de tipos de referência como objeto podem ser usados.
Criar um objeto não exige necessariamente o uso do novo operador. Existem alguns tipos que podem ser simplificados na criação. Por exemplo, criando um objeto de objeto de tipo como acima, você também pode usar os dois métodos a seguir:
var pessoa = {}; pessoa.name = "jiangshui"; pessoa.sayname = function () {console.log (this.name);}ou
var pessoa = {nome: "jiangshui", SayName: function () {console.log (this.name); }};A função do operador {} é a mesma que new Object (), simplificando operações. Existem algumas diferenças nos dois métodos de escrita acima. O primeiro é "Apênder", ou seja, na definição anterior, continua a adicionar atributos ou métodos. Se o método de atributo de mesmo nome já existir antes, ele será substituído. O segundo tipo é "substituição", o que significa que, independentemente de as propriedades e métodos do objeto de pessoa ser definido antes, esse método substituirá o conteúdo definido anteriormente pelo conteúdo recém -definido. Como o objeto gerado pelo tipo de referência é uma região armazenada na memória e, em seguida, seu ponteiro é salvo em uma determinada variável (pessoa), a segunda maneira de escrever é gerar um novo objeto (nova área de memória) e, em seguida, apontar a variável pessoa para a nova área de memória, para que a anterior seja substituída. Compreender isso é crucial para o entendimento posterior.
O uso de outros tipos de referência é aproximadamente o mesmo, como o tipo de matriz, que também pode ser usado para gerar objetos ou defini -los diretamente. Depois de gerar um objeto de matriz, você pode armazenar o conteúdo de informações no formato da matriz. Além disso, o objeto receberá os métodos definidos no tipo de matriz, como push, shift, classificação etc., e você pode chamar esses métodos, como:
var colors = []; cores.push ('vermelho', 'verde'); console.log (cores);O código acima cria um objeto do tipo Array através do tipo de matriz e chama o método push definido anteriormente no tipo de matriz, adiciona dois valores vermelho e verde ao objeto e, finalmente, o imprime no console e você pode vê-lo.
Ligue e aplique métodos
Esses dois métodos são fornecidos pelo tipo de função, o que significa que eles podem ser usados nas funções. A função da chamada é a mesma que o método de aplicação, que é que ele pode expandir o escopo da operação da função. A diferença é que, ao usar a chamada, os parâmetros passados para a função devem ser listados um por um, mas o método de aplicação não o usa. Dessa forma, você pode decidir usar a chamada ou aplicar de acordo com os requisitos de sua própria função.
O que significa o escopo da operação da função de expansão? Você entenderá dando um exemplo.
Você pode entender dessa maneira que a função é envolvida em um contêiner (escopo) e existem algumas variáveis ou outras coisas neste contêiner. Quando a função é executada, essas variáveis são chamadas, etc., você encontrará isso no contêiner atual. Este contêiner envolve um recipiente maior do lado de fora. Se o pequeno contêiner atual não o tiver, a função pesquisará no contêiner maior e assim por diante e encontrará o maior objeto de janela de contêiner. No entanto, se a função estiver em execução no pequeno contêiner atual, existem variáveis correspondentes, etc. No pequeno contêiner, mesmo no recipiente grande, a função ainda a chamará em seu próprio contêiner.
Os métodos de chamada e aplicação são resolver esse problema e interromper as limitações dos contêineres. Quanto ao exemplo anterior:
var pessoa = {nome: "jiangshui", SayName: function () {console.log (this.name); }};Depois de abrir o console do Chrome, colar -o e executá -lo e depois execute a pessoa.sayname () para ver
No momento, a pessoa é um contêiner, que cria um método SayName (função). Ao executar, ele deve ser executado sob o escopo da pessoa. Quando executado diretamente na parte inferior, ou seja, a execução sob o escopo da janela causará um erro não definido porque o método Sayname não está definido abaixo da janela. O ponteiro dentro é uma coisa especial, que aponta para o escopo atual. O significado deste. Nome é chamar o valor do nome abaixo do escopo atual.
Em seguida, adicionamos um atributo de nome ao objeto da janela:
window.name = "yujiangshui";
Ou diretamente
name = "yujiangshui";
Como a janela é o maior recipiente, a janela pode ser omitida. Todos os atributos ou variáveis definidos são anexados à janela. Se você não acredita, pode ver:
Agora queremos executar o método SayName no pequeno recipiente de pessoa sob o grande recipiente da janela. Precisamos usar a chamada ou aplicar para expandir o escopo do método SayName. Execute a seguinte declaração:
pessoa.SayName.Call (Window);
ou
pessoa.sayname.call (this);
Os resultados da saída são os mesmos. Você também pode usar o Aplicar para ver o efeito, porque essa demonstração é muito simples e não requer parâmetros de passagem; portanto, as funções de chamada e aplicação são completamente consistentes.
Deixe -me explicar o código acima. O SayName é primeiro uma instância do tipo de função, que possui o método de chamada e o método Aplicar. Como os métodos de chamada e aplicação são métodos de função, precisamos ligar para a pessoa.
Em seguida, os parâmetros dos métodos de chamada e aplicação são um escopo (objeto), indicando que a função anterior é executada sob o escopo passado. Depois de passar o objeto da janela, este.name no método SayName aponta para Window.name, para que o escopo seja expandido.
Por que a passagem da janela e isso tem o mesmo efeito? Como a localização atual da execução desta função é a janela, como mencionado anteriormente, esse ponteiro aponta para o escopo atual, portanto, esse ponteiro aponta para a janela, para que seja igual à janela.