Recientemente vi una biblioteca JS escrita por otra persona. De repente tuve algunas ideas sobre el prototipo y la herencia en JS. He visto algunos de ellos antes, pero no son muy claros. Usé mi tiempo libre en estos días para comprender esta área, y todavía siento que hay algo mal en él. La idea no está tan organizada, solo para compartir.
1. Instancia de
En JavaScript, existe la instancia del operador, que es un operador binario. Use el método instancea instancea de A, y el valor de retorno es un booleano, lo que significa determinar si Instancea es una instancia de A, y su esencia es determinar si A.Prototype === Instancea .__ Proto__, como
función f2 () {var f = function () {} var test = new f (); console.log (prueba instanceaf f); // true console.log ((f.prototype ==== Test .__ Proto __)); // true}Ambas impresiones anteriores son verdaderas. Indica que la prueba es una instancia de F; El atributo __proto__ de los puntos de prueba al objeto prototipo de F, es decir, la propiedad prototipo de F es un objeto, y este objeto es una instancia de f.
2. Objetos en JS
Todo es un objeto en JS. Los objetos se dividen en objetos de función y objetos ordinarios. Las funciones comunes son en realidad objetos de función, como
// Function Object var f = function () {} var f2 = new function ('str', 'console.log (str)') function f3 () {} // objeto ordinario var o = new object (); var o2 = {} var o3 = new f ()Como se muestra arriba, F, F2 y F3 son objetos de función, y O, O2 y O3 son objetos ordinarios.
La diferencia entre un objeto de función y un objeto normal:
Todos los objetos creados usando nueva función () son objetos de función, F y F3, y en última instancia también se crean usando nueva función ();
Al definir un objeto, el objeto contiene algunas propiedades predefinidas, como prototipo y __proto__. El atributo prototipo solo está disponible en objetos de función, y __proto__ está disponible para todos los objetos. Por lo tanto, se puede determinar mediante el atributo __proto__ del objeto del objeto para determinar si un objeto es un objeto de función o un objeto normal, como
// objeto de función var f = function () {} // Object ordinary var o = new Object (); console.log (f.prototype); // objeto {} console.log (o.prototype); // indefinidoDe lo anterior, podemos encontrar que el objeto de función tiene un atributo prototipo, mientras que el objeto prototipo de los objetos ordinarios no está definido.
3. Cadena prototipo
De lo anterior, sabemos que todos los objetos tienen un atributo __proto__, que apunta al prototipo de objeto prototipo del objeto de función que lo creó. Llamamos a esta cadena en cadena utilizando el atributo __proto__ una cadena prototipo, como la siguiente es una cadena prototipo.
La imagen de arriba, tomando a la persona como ejemplo, ilustra la cadena prototipo.
var persona = function () {} var persona1 = nueva persona ();1. La persona es un objeto de función, la persona1 es una instancia de persona
2. El atributo __proto__ de la persona1 es el objeto prototipo de persona.
3. Dado que el objeto prototipo de la persona, la persona, el propototipo es un objeto, también tiene un atributo __proto__, que apunta al objeto objeto objeto objeto.prototype
4. Prototipo de objeto Object.prototype es un objeto, que también tiene un atributo __proto__, y el objeto prototipo de este atributo es nulo.
4. Alguna herencia
En JS definiremos un objeto de función, como
var persona = function () {}Arriba definimos un objeto de función, que no tiene propiedades y es un objeto vacío. Como es un objeto, puede agregarle propiedades.
var persona = function () {} persona.name1 = 'js'console.log (persona.name1) // jsEl código anterior ha agregado un atributo de nombre a la persona y asignó un valor a JS, y el valor del atributo de nombre se puede imprimir.
Pero cuando creamos una instancia de persona1, como sigue
var persona = function () {}; persona.name1 = 122; console.log (persona.name1); VAR Person1 = nueva persona (); console.log (persona1.name1); // indefinidoPuede ver que la persona1 no tiene el atributo Name1, entonces, ¿cómo podemos asegurar que las instancias de la persona también tengan el atributo Name1?
var persona = function () {}; persona.name1 = 122; // Use el objeto prototipo para agregar atributos al objeto, de modo que las instancias tengan este atributo persona.prototype.name1 = '12 '; console.log (persona.name1); VAR Person1 = nueva persona (); console.log (persona1.name1); // 12Arriba, se usa la persona.protoype.name1 = '12 ', para que todas las instancias tengan el atributo Name1. Los atributos agregados de esta manera se considerarán como atributos comunes de la instancia al generar la instancia.
El artículo anterior se basa en prototipos y herencia en JS. Todo el contenido que comparto con ustedes es el editor. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.