Cuando miré el primer paso del código fuente jQuery, estaba confundido sobre la creación de objetos jQuery. Después de pensarlo durante mucho tiempo, finalmente lo sentí. Aquí lo grabo
El primer método:
var a = function () {return a.prototype.init ();} a.prototype = {init: function () {this.age = 50; console.log (this); return this;}, edad: 100} console.log (a () === new ());1. Analiza por qué el resultado es cierto
La función A.Prototype.init () se llama internamente por A ()
New A () llamará al constructor internamente, y su constructor es function () {return a.prototype.init ();}, y la misma llamada es la función A.prototype.init ()
2. análisis de lo que devuelve la función A.prototype.init ()
Depende de esto, determine a quién señala. Necesitamos analizarlo al llamar a la función. Dado que se llama como el atributo del objeto prototipo, este es el objeto prototipo A.prototype
En esta forma de creación, no importa cuántas veces llame a A (), en realidad son el mismo objeto devuelto, por lo que la modificación del objeto B afectará el objeto A, vea la figura a continuación
var a = a (); var b = a (); console.log (a.age); console.log (b.age); b.age = 22; console.log (a.age); console.log (b.age); console.log (b.age);
Entonces, ¿cómo resolver este problema? Hablemos sobre el segundo método, que también es el método utilizado por JQuery.
El segundo camino
var a = function () {return new A.Prototype.init (); // ①} a.prototype = {init: function () {this.age = 50; console.log (this); devuelve esto;}, edad: 100}A.prototype.init.prototype = a.prototype; // ②var a = new a (); var b = new a (); console.log (a === b); console.log (a.age); console.log (b.age); b.age = 22; console.log (a.age); console.log (b.age); console.log (b.age);
Análisis de ① y ②
①in New A.Prototype.init () principalmente hace tres cosas
Crear un objeto vacío var obj = {};
Obj Object Property_Proto_ señala el prototipo de la función a.prototype.init;
Reemplace esto en la función A.Prototype.Init con objeto OBJ, llame a A.Prototype.init Función, A.Prototype.init.call (OBJ), y devuelva el nuevo objeto
Debido a que ① el prototipo del objeto devuelto es A.prototype.init.prototype, no tiene nada que ver con A.Prototype. Para hacer que el objeto recién devuelto herede de A.Prototype, ② Sea A.Prototype.init.Prototype apuntando a A.Prototype
Por lo tanto, el segundo método es crear una instancia y asegurarse de que cada uno de su propio alcance sea independiente.
Lo anterior es una explicación detallada del nuevo ejemplo de construcción gratuita de JavaScript presentado por el editor. Espero que te ayude. Si desea saber más información, ¡preste atención al sitio web de Wulin.com!