JavaScript es el único lenguaje ampliamente utilizado para la herencia de prototipos, por lo que lleva tiempo comprender las diferencias entre los dos métodos de herencia.
La primera gran diferencia es que JavaScript utiliza cadenas prototipo para heredar:
función foo () {this.value = 42;} foo.prototype = {método: function () {}}; function bar () {}Establezca el prototipo de la barra en la instancia del objeto de Foo:
Bar.prototype = new foo (); bar.prototype.foo = 'Hello World';
Asegúrese de que el constructor de barra sea en sí mismo y cree una nueva instancia de objeto de barra:
Bar.prototype.constructor = bar; var test = new Bar ();
Echemos un vistazo a la composición de toda la cadena prototipo:
prueba [instancia de bar] bar.prototype [instancia de foo] {foo: 'hola world'} foo.prototype {método: ...} objeto.prototype {toString: ... / * etc. * /}En el ejemplo anterior, la prueba de objeto heredará tanto el bar.prototype como el foo.prototype. Por lo tanto, puede acceder al método de función definido en FOO. Por supuesto, también puede acceder al valor de la propiedad. Debe mencionarse que cuando no se crea una nueva barra (), se reutiliza una nueva instancia de FOO, pero la instancia de FOO que viene con su objeto prototipo. Del mismo modo, todas las instancias de barra comparten el mismo atributo de valor. Demos ejemplos:
test1 = new Bar (); test2 = new Bar (); Bar.prototype.value = 41; test1.Value // 41 test2.Value // 41
Mecanismo de búsqueda de cadena prototipo
Al acceder a las propiedades de un objeto, JavaScript atravesará toda la cadena prototipo desde el objeto mismo hasta que encuentre las propiedades correspondientes. Si alcanza la parte superior de la cadena prototipo, que es el objeto. Prototipo en el ejemplo anterior, y aún no se encontrarán atributos, entonces JavaScript devolverá el valor indefinido.
Propiedades de los objetos prototipo
Aunque JavaScript utiliza las propiedades del objeto prototipo para construir la cadena prototipo, aún podemos asignar valores. Pero copiar el valor original al prototipo no es válido, como:
función foo () {} foo.prototype = 1; // sin efectoAquí hay una distracción de este artículo e introduce cuál es el valor original:
En JavaScript, las variables pueden almacenar dos tipos de valores, a saber, el valor original y el valor de referencia.
1. Valor primitivo:
Los valores originales son valores fijos y simples, que son segmentos de datos simples almacenados en la pila, es decir, sus valores se almacenan directamente en la ubicación donde se accede a la variable.
Hay cinco tipos de tipos primitivos: indefinido, nulo, booleano, número, cadena.
2. Valor de referencia:
El valor de referencia es un objeto relativamente grande, el objeto almacenado en el montón de montón, es decir, el valor almacenado en la variable es un puntero de puntero que apunta a la memoria donde se almacena el objeto. Todos los tipos de referencia están integrados de Object.
Problemas de rendimiento de la cadena prototipo
Si los atributos que se encontrarán se encuentran en la parte superior de la cadena prototipo, el proceso de búsqueda sin duda tendrá un impacto negativo en el rendimiento. Esta será una consideración clave cuando se encuentre en escenarios en los que sean necesarios los requisitos de rendimiento. Además, tratar de encontrar una propiedad que no exista atravesará toda la cadena prototipo.
Del mismo modo, al atravesar las propiedades de un objeto, se accederá a todas las propiedades en la cadena prototipo.
Resumir
Comprender la herencia prototipo es el requisito previo para escribir un código JavaScript más complejo, y también debe prestar atención a la altura de la cadena prototipo en el código. Al enfrentar cuellos de botella de rendimiento, debe aprender a dividir la cadena prototipo. Además, para distinguir el prototipo de objeto prototipo del prototipo __proto__, discutiremos principalmente el prototipo de objeto prototipo aquí, y no explicaremos el problema sobre el prototipo __proto__.