1. Reserva de conocimiento:
1. Funciones que enumeran los nombres de los atributos:
(1) Para ... en: puede atravesar todas las propiedades enumerables en el objeto (incluidas las propiedades propias y las propiedades heredadas) en el cuerpo del bucle.
(2) Object.Keys (): Devuelve una matriz (atributos enumerables)
(3) Object.getOwnPropertynames (): todas las propiedades propias
3. Propiedades de los atributos: atributos de datos y atributos de accesorios
(1) Atributos de datos: valor configurable de enumerable por escrito
El atributo de datos tiene solo un valor simple;
(2) Atributos de accesorios: escribir (set), leer (obtener), enumerable, configurable
Los accesorios no son escritos (es decir, no hay características de escritura).
Si el atributo tiene un método establecido, entonces este atributo es redactado y hay un método GET, entonces este atributo es legible.
4. Métodos para definir las propiedades del atributo: objeto.defineProperty (objeto, atributo, objeto descriptor)
5. Obtenga el objeto Descriptor de la propiedad: Object.getOwnPropertyDescriptor (Object, Propiedad)
2. Ejemplo
1. Según el uso de para ... en, podemos escribir un método para simular "herencia":
<script type = "text/javaScript"> var child = {}; var madre = {nombre: "zhangzhiying", LISTAGE: 21, sexo: "mujer"}; function extend (target, fuente) {for (var p en fuente) {target [p] = fuente [p]; } objetivo de retorno; } extender (niño, madre); console.log (niño); // <strong> objeto {nombre: "Zhangzhiying", Lastage: 21, Sex: "femenino"} </strong> </script>2. Use para In To enrollar las propiedades del objeto prototipo y luego asigne valores a nuestros objetos vacíos uno por uno, dando así así a "herencia". Esta idea es muy correcta. Vamos a modificar el ejemplo anterior:
<script type = "text/javaScript"> var child = {}; var madre = {nombre: "zhangzhiying", LISTAGE: 21, <strong> set Age (value) {this.Lastage = value; }, Get Age () {return this.lastage+1; }, </strong> sexo: "femenino"}; <br> <strong> mother.age = 15; </strong> // Hay un método establecido, que tiene la función de escritura extender (target, fuente) {para (var p en fuente) {target [p] = fuente [p]; } objetivo de retorno; } extender (niño, madre); console.log (niño); // <strong> objeto {nombre: "Zhangzhiying", Lastage: 15, edad: 16, sexo: "mujer"} </strong> </script>Puede ver que se usan un par de conjuntos en el código, get; donde la edad es un atributo de accesor.
El resultado de la ejecución: un objeto normal que no contiene SET, Get.
Conclusión: La "herencia" implementada por For no maneja el conjunto y obtiene, convierte el atributo del accesor (edad) en un atributo de datos estáticos.
3. Establezca atributos de datos para el objeto Mother
<script type = "text/javaScript"> var child = {}; var madre = {nombre: "Zhangzhiying", LISTAGE: 21, Establecer edad (valor) {this.lastage = value; }, Get Age () {return this.lastage+1; }, sexo: "mujer"}; Object.defineProperty (Madre, "Lastage", {Writable: False}); // establecer LISTAGE para no ser Madre Writable.AGE = 15; // Establecer inválido, porque el valor de Lastage permanece sin cambios, Lastage+1 permanece sin cambios, es decir, la edad sigue siendo la función sin cambios (Target, Source) {for (var p en fuente) {objetivo [p] = fuente [p]; } objetivo de retorno; } extender (niño, madre); console.log (niño); // Objeto {nombre: "Zhangzhiying", Lastage: 21, edad: 22, sexo: "mujer"} child.lastage = 12; // El resultado muestra que los cambios de Lastage, lo que indica que Child.Lastage no "hereda" la característica de Mother.Lastage. Usemos el método GetownPropertyDesriptor () para confirmar <br> console.log (object.geto<Em id = __ mcedel> </script> </em>
Conclusión: para lograr la herencia, aún necesitamos resolver el problema -> características del atributo de "herencia".
4. Versión completa
<script type = "text/javaScript"> var child = {}; var madre = {nombre: "Zhangzhiying", LISTAGE: 21, Establecer edad (valor) {this.lastage = value; }, Get Age () {return this.lastage+1; }, sexo: "mujer"}; Object.defineProperty (Madre, "Lastage", {Writable: False}); madre. <Span style = "color: #333399"> <strong> function extend (target, fuente) {var nombres = objeto.getOwnPropertynames (fuente); // Obtenga todos los nombres de propiedad para (var i = 0; i <names.length; i ++) {if (nombres [i] en Target) Continuar; // Si existe esta propiedad, omita (en herencia prototipo, si el atributo de la propia propiedad y la propiedad del objeto prototipo se duplican, retenga la propia propiedad) var desc = objeto.getownpropertyDescriptor (fuente, nombres [i]); // Obtenga el objeto descriptor del atributo madre (es decir, el conjunto de características del atributo, representado por el objeto descriptor en ES5) objeto. DefineProperty (Target, Names [i], Desc); // Obtener el objeto descriptor de la madre a la definición de atributo del niño} Target de retorno; } </strong> </span> extender (niño, madre); console.log (niño); child.lastage = 12; console.log (object.getOwnPropertyDescriptor (niño, "Lastage")); console.log (niño); </script>Resultados finales:
Puede ver claramente la impresión tres veces, el niño "heredado" para establecer y obtener, el valor de Latina no ha cambiado, y la escritura también es falsa.
Resumen: Estoy leyendo la "Guía autorizada de JavaScript" recientemente. Resumiré algunas experiencias. Si hay algún error, por favor corrígeme y aprenda y avance juntos ~
La explicación detallada anterior de la herencia de JavaScript usando funciones es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.