1. Valor original y valor de referencia
El valor original se almacena en la pila y el valor de referencia se almacena en el montón. Como el programa:
Copie el código de código de la siguiente manera:
función Persona(id,nombre,edad){
this.id = identificación;
this.nombre = nombre;
this.age = edad;
}
varnum = 10;
var bol = verdadero;
var cadena = "abc";
var obj = nuevo Objeto();
var arr = ['a','b','c'];
var persona = nueva Persona(100,"Lema del idiota",25);
2.indefinido y nulo
indefinido: La variable no está definida; es un valor exclusivo de tipo Indefinido;
nulo: la referencia no está asignada; es un valor exclusivo de tipo Nulo.
tipo de (indefinido) == indefinido;
tipo de (nulo) == objeto;
indefinido==nulo;
indefinido!==nulo;
instancia nula del objeto == falso;
instancia indefinida de Objeto == falso;
Aunque existen tipos Indefinido y Nulo, el siguiente ejemplo ilustra que estos dos tipos son invisibles, lo que significa que solo podemos usar sus valores:
alerta (instancia indefinida de Indefinido);
alerta (instancia nula de nulo);
3. Pseudomatriz
Características:
1) Tiene atributo de longitud;
2) Acceder a los datos en orden de índice como una matriz;
3) No existen métodos de manipulación de datos específicos de una matriz, como push, pop, slice...
Las pseudomatrices se pueden convertir en matrices reales a través de Array.prototype.slice:
var faceArray = {0: 'a', 1: 'b', longitud: 2}//Pseudomatriz estándar;
var realArray = Array.prototype.slice.call(fakeArray);
Pseudomatrices en js: argumentos, node.childNodes, document.getElementsByTagName()...
Problema en IE: node.childNodes en IE no se puede convertir con un segmento.
Pseudomatriz en Jquery: Jquery en sí es una pseudomatriz:
alerta($('.class1').length); alerta($('.class1').[0].tagName);
4. Acerca de los literales de tipo simple
var a = 1; b = verdadero, c = "ccc";
Los literales parecen tener tipos.
alerta(tipo de a);//número
alerta(tipo de b);//booleano
alerta(tipo de c);//cadena
Pero no se puede medir mediante instancia de.
alerta(una instancia de Número)//falso
alerta(una instancia de Objeto)//falso
alerta (b instancia de booleano) // falso
alerta (b instancia de objeto) // falso
alerta (c instancia de cadena) // falso
alerta (c instancia de objeto) // falso
5. El atributo prototipo de la función y el atributo prototipo interno de la instancia del objeto.
Cada función (constructor) tiene un atributo de prototipo, y cada instancia de objeto tiene un atributo de prototipo interno invisible (mozilla lo hace público y se puede obtener a través de __proto__), que apunta al atributo de prototipo del constructor. Su propia propiedad de prototipo forma la cadena de prototipos. El objeto es el objeto superior, por lo que todas las cadenas de prototipos eventualmente apuntarán a Object.prototype Al acceder a las propiedades/métodos de la instancia del objeto. Comience a buscar desde la instancia del objeto. Si no se puede encontrar, busque hacia arriba a lo largo de la cadena del prototipo hasta Object.prototype.prototype == null.
6. Un pequeño secreto del constructor.
Copie el código de código de la siguiente manera:
var s = nueva función(){return "sss"};
alerta(s);//[objeto Objeto]
s = nueva función(){return new String("sss")};
alerta(s);//sss
Explicación de este código:
Siempre que el constructor después de la nueva expresión devuelva un objeto de referencia (matriz, objeto, función, etc.), sobrescribirá el objeto anónimo creado por new. Si devuelve un tipo primitivo (cuando no hay retorno, en realidad devuelve. el tipo primitivo indefinido), luego se devuelve el objeto anónimo creado por new.
7. El proceso de creación de objetos.
Copie el código de código de la siguiente manera:
función Persona(nombre){
this.nombre = nombre;
}
Persona.prototipo = {
getName: función(){devolver este.nombre}
};
var p = nueva Persona('zhangsan');
Descifrar el proceso de creación de p:
◦Cree un objeto incorporado obj e inicialícelo;
◦Apunte el [[Prototipo]] interno de p a Persona.prototipo;
◦Use p como esto y use el parámetro de argumentos para llamar al método interno [[Call]] de Person, es decir, ejecutar el cuerpo de la función Person y devolver el valor de retorno. Si no hay retorno, se devuelve indefinido;
◦Si el paso anterior devuelve un tipo de Objeto, devuelve este valor a p; de lo contrario, devuelve obj.
8. Propiedades propias del objeto y propiedades heredadas.
Copie el código de código de la siguiente manera:
función Persona(nombre){
this.nombre = nombre;
}
Persona.prototipo = {
tipo: 'humano',
getName: función(){devolver este.nombre}
};
var p = nueva Persona('zhangsan');
alert(p.hasOwnProperty('tipo'));//falso
p.tipo = 'ren';
alert(p.hasOwnProperty('tipo'));//verdadero
El resultado de la ejecución es muy claro. Las propiedades de un objeto no pueden modificar la propiedad del mismo nombre en su prototipo, solo crearán una propiedad del mismo nombre y le asignarán un valor.
9.Proceso de creación de objetos funcionales.
Cree un objeto incorporado fn;
Establezca el [[Prototipo]] interno de fn en Function.prototype;
Establezca el atributo interno [[Call]], que es un método implementado internamente que maneja la lógica de las llamadas a funciones. (Simplemente entendido como apuntar al cuerpo de la función);
Establezca fn.length en funArgs.length. Si la función no tiene parámetros, establezca fn.length en 0;
El constructor de fn.prototype apunta al propio fn;
Volver fn.
10.Principio de instancia
Para verificar si a es una instancia de B, debe verificar si el objeto al que apunta el prototipo de B (atributo de prototipo del constructor) está en la cadena de prototipos de a.
11. Conjeturas sobre función y objeto
alerta (instancia de función de función); // verdadero
alerta (instancia de función del objeto); // verdadero
alerta (instancia de objeto de función); // verdadero
alerta (instancia de objeto de objeto); // verdadero
Lo he estado pensando durante mucho tiempo, pero no lo he descubierto...