1. Valor original e valor de referência
O valor original é armazenado na pilha e o valor de referência é armazenado na pilha. Como o programa:
Copie o código do código da seguinte forma:
function Pessoa(id,nome,idade){
isto.id = id;
este.nome = nome;
esta.idade = idade;
}
varnum = 10;
var bol = verdadeiro;
varstr = "abc";
var obj = novo Objeto();
var arr = ['a','b','c'];
var pessoa = new Pessoa(100,"Lema do idiota",25);
2.indefinido e nulo
indefinido: a variável é indefinida; é um valor exclusivo do tipo Indefinido;
null: A referência não está alocada, é um valor exclusivo do tipo Null.
typeof(indefinido) == indefinido;
typeof(nulo) == objeto;
indefinido==nulo;
indefinido!==nulo;
instância nula do objeto == falso;
instância indefinida de Object == false;
Embora existam tipos Indefinidos e Nulos, o exemplo a seguir ilustra que esses dois tipos são invisíveis, o que significa que só podemos usar seus valores:
alerta (instância indefinida de indefinido);
alerta(instância nula de Nulo);
3. Pseudomatriz
Características:
1) Possui atributo comprimento;
2) Acesse os dados em ordem de índice como um array;
3) Não existem métodos de manipulação de dados específicos do array, como push, pop, slice...
Pseudo arrays podem ser convertidos em arrays reais através de Array.prototype.slice:
var faceArray = {0: 'a', 1: 'b', length: 2}//Pseudo array padrão;
var realArray = Array.prototype.slice.call(fakeArray);
Pseudo arrays em js: argumentos, node.childNodes, document.getElementsByTagName()...
Problema no IE: node.childNodes no IE não pode ser convertido com slice.
Pseudo array em Jquery: o próprio Jquery é um pseudo array:
alert($('.class1').length); alert($('.class1').[0].tagName);
4. Sobre literais de tipo simples
var a = 1; b = verdadeiro, c = "ccc";
Literais parecem ter tipos
alerta(tipo de a); //número
alerta(tipo de b); //boolean
alerta(tipo de c); //string
Mas não pode ser medido através de instanceof.
alerta(uma instância de número) //falso
alerta(uma instância de objeto) //falso
alerta(b instância de Boolean) //falso
alerta(b instância do objeto) //falso
alerta(c instância de String) //falso
alerta(c instância do objeto) //falso
5. O atributo protótipo da função e o atributo protótipo interno da instância do objeto
Cada função (construtor) possui um atributo de protótipo, e cada instância de objeto possui um atributo de protótipo interno invisível (o Mozilla o torna público e pode ser obtido através de __proto__), que aponta para o atributo de protótipo do construtor. A própria propriedade do protótipo, que forma a cadeia de protótipos, é o objeto principal, portanto, todas as cadeias de protótipos eventualmente apontarão para Object.prototype. Comece a pesquisar a partir da própria instância do objeto. Se não puder ser encontrado, pesquise para cima ao longo da cadeia de protótipos até Object.prototype.prototype == null.
6. Um segredinho do construtor
Copie o código do código da seguinte forma:
var s = nova função(){return "sss"};
alerta(s); //[objeto Objeto]
s = nova função(){retornar nova String("sss")};
alerta(s); //sss
Explicação deste código:
Contanto que o construtor após a nova expressão retorne um objeto de referência (matriz, objeto, função, etc.), ele substituirá o objeto anônimo criado por new. Se retornar um tipo primitivo (quando não há retorno, na verdade retorna. o tipo primitivo undefined ), então o objeto anônimo criado por new é retornado.
7. O processo de criação de objetos
Copie o código do código da seguinte forma:
função Pessoa(nome){
este.nome = nome;
}
Pessoa.protótipo = {
getNome: function(){retornar este.nome}
};
var p = new Pessoa('zhangsan');
Descriptografe o processo de criação de p:
◦Crie um objeto incorporado obj e inicialize-o;
◦Aponte o [[Prototype]] interno de p para Person.prototype;
◦Use p desta forma e use o parâmetro argumentos para chamar o método [[Call]] interno de Person, ou seja, execute o corpo da função Person e retorne o valor de retorno. Se não houver retorno, é retornado indefinido;
◦Se a etapa anterior retornar um tipo de Objeto, retorne esse valor para p, caso contrário, retorne obj.
8. Propriedades próprias do objeto e propriedades herdadas
Copie o código do código da seguinte forma:
função Pessoa(nome){
este.nome = nome;
}
Pessoa.protótipo = {
tipo: 'humano',
getNome: function(){retornar este.nome}
};
var p = new Pessoa('zhangsan');
alert(p.hasOwnProperty('type'));//falso
p.type = 'ren';
alert(p.hasOwnProperty('type'));//true
O resultado da execução é muito claro. As propriedades de um objeto não podem modificar a propriedade de mesmo nome em seu protótipo, mas apenas criarão uma propriedade de mesmo nome e atribuirão um valor a ela.
9. Processo de criação de objetos de função
Crie um objeto integrado objeto fn;
Defina o [[Prototype]] interno de fn como Function.prototype;
Defina o atributo interno [[Call]], que é um método implementado internamente que lida com a lógica das chamadas de função. (Simplesmente entendido como apontando para o corpo da função);
Defina fn.length como funArgs.length Se a função não tiver parâmetros, defina fn.length como 0;
O construtor de fn.prototype aponta para o próprio fn;
Retornar fn.
10.Princípio de instância
Para verificar se a é uma instância de B, você precisa verificar se o objeto apontado pelo protótipo de B (atributo de protótipo do construtor) está na cadeia de protótipos de a.
11. Suposições sobre Função e Objeto
alert(Função instanceof Function); //true
alert(Função instanceof Object); //true
alert(objeto instância da função); //true
alert(Object instanceof Object); //true
Estou pensando nisso há muito tempo, mas ainda não descobri...