Este artículo le brinda conocimientos relevantes sobre JavaScript, que presenta principalmente cuestiones relacionadas con la orientación a objetos, incluidos descriptores de atributos, descriptores de datos, descriptores de acceso, etc., echémosle un vistazo juntos, espero que sea útil para todos.
[Recomendaciones relacionadas: videotutorial de javascript, interfaz web]
En realidad, JavaScript admite una variedad de paradigmas de programación, incluida la programación funcional y la programación orientada a objetos:
Los objetos en JavaScript están diseñados como una colección desordenada de atributos , como una tabla de hip-hop, que consta de claves y valores;
La clave es un nombre de identificador y el valor puede ser de cualquier tipo u otro tipo de objeto o función;
Si el valor es una función, entonces podemos llamarlo método del objeto ;
La forma más común de crear objetos en los primeros días es usar la clase Object y usar la nueva palabra clave para crear un objeto y luego almacenar las propiedades o métodos en el objeto:
var obj = nuevo objeto() obj.nombre = 'por qué' console.log(obj.name, obj) // por qué { nombre: 'por qué' }
Más tarde, por conveniencia, muchos desarrolladores crearon objetos directamente en forma de literales:
//Método literal var obj2 = { nombre: 'jam', edad: '8' } console.log(obj) // { nombre: 'jam', edad: '8' }
Anteriormente, nuestras propiedades se definían directamente dentro del objeto o se agregaban directamente al objeto;
Pero de esta manera no podemos imponer algunas restricciones a este atributo: por ejemplo, ¿se puede eliminar este atributo mediante delect
y se puede atravesar durante el recorrido for-in
?
Si queremos tener un control operativo más preciso sobre un atributo, entonces puedo usar descriptores de atributos . Las propiedades de un objeto se pueden agregar o modificar con precisión mediante descriptores de propiedad;
Los descriptores de propiedades deben usar Object.defineProperty
para agregar o modificar propiedades.
属性描述符分为两种:数据描述符和存取描述符
Un descriptor de datos es una propiedad con un valor que se puede escribir o no. El descriptor de datos tiene los siguientes valores clave opcionales:
valor: El valor correspondiente a este atributo. Puede ser cualquier valor de JavaScript válido (valor numérico, objeto, función, etc.). El valor predeterminado no está definido.
escribible: si y solo si la capacidad de escritura de este atributo es verdadera, el operador de copia puede cambiar el valor. El valor predeterminado es falso.
Configurable: si y solo si el atributo configurable es verdadero, el descriptor del atributo se puede cambiar y el atributo también se puede eliminar del objeto correspondiente. El valor predeterminado es falso.
enumerable: si y solo si el enumerable de la propiedad es verdadero, la propiedad puede aparecer en la propiedad de enumeración del objeto. El valor predeterminado es falso.
El método Object.getOwnPropertyDescriptor() devuelve el descriptor de propiedad correspondiente a una propiedad propia en el objeto especificado.
Objeto.getOwnPropertyDescriptor(obj, prop)
obj: el objeto objetivo que se va a encontrar
prop: nombre del atributo en el objeto de destino (tipo cadena).
Valor de retorno: si la propiedad especificada existe en el objeto, se devuelve su objeto descriptor de propiedad; de lo contrario, se devuelve indefinido.
Nota: Si el primer parámetro de este método no es un objeto, se informará un error (TypeError).
El método Object.defineProperty() define directamente una nueva propiedad en un objeto o modifica una propiedad existente de un objeto y devuelve el objeto.
Objeto.defineProperty(obj, prop, descriptor)
obj: El objeto sobre el que se definirán las propiedades.
prop: El nombre de la propiedad que se definirá o modificará.
descriptor: el descriptor de atributo que se definirá o modificará
Valor de retorno: el objeto pasado a la función.
El siguiente código de muestra muestra la configuración y obtención de descriptores de atributos var obj = { nombre: 'mermelada', edad: 8 } Object.defineProperty(obj, 'trabajo', { valor: 'abogado' }) console.log(Object.getOwnPropertyDescriptor(obj, 'age')) // { valor: 8, escribible: verdadero, enumerable: verdadero, configurable: verdadero } console.log(obj.job) // Abogado // Nueva propiedad a través de defineProperty, esta nueva propiedad no es modificable, no eliminable y no enumerable console.log(Object.getOwnPropertyDescriptor(obj, 'job')) // {valor: 'Abogado', escribible: falso, enumerable: falso, configurable: falso}
注意:通过defineProperty新增的属性,该新属性是不可修改、不可删除以及不可枚举的
var objeto = { nombre: 'mermelada', edad: 8 } Object.defineProperty(obj, 'dirección', { valor: 'Hebei', // configurable Esta propiedad no se puede eliminar, ni se puede usar defineProperty para modificar el descriptor de propiedad nuevamente configurable: false, }) eliminar obj.address // Quiero usar eliminar para eliminar este atributo obj.address = 'Guangzhou' // Quiero modificar el valor de la dirección del atributo en obj a Guangzhou console.log(obj.address) // Resultado de salida: Hebei
Debido a que el valor configurable del descriptor de atributo es falso y no se puede eliminar ni modificar, la eliminación y modificación no tendrán efecto.
var objeto = { nombre: 'mermelada', edad: 8}Object.defineProperty(obj, 'sexo', { valor: 'Hombre', // enumerable configura si esta propiedad se puede enumerar enumerable: true})for (i in obj) { consola.log(i)}
Cuando es enumerable: falso, el resultado de salida es la edad del nombre
Cuando es enumerable: verdadero, el resultado de salida es nombre edad sexo
var objeto = { nombre: 'mermelada', edad: 8}Object.defineProperty(obj, 'puntuación', { valor: 80, // escribible: verdadero grabable: falso})obj.score = 100 console.log(obj.score) // 80
Debido a que el valor de escritura es falso, cuando la puntuación se modifica a 100, la modificación no se realiza correctamente y el resultado final es 80.
¿Cree que es engorroso configurar el descriptor de propiedad de una sola propiedad a la vez? Object.defineProperties puede ayudarlo a resolver el problema.
El método Object.defineProperties() define una o más propiedades nuevas o modifica las propiedades existentes para un objeto y devuelve el objeto.
Objeto.defineProperties(obj, accesorios)
obj: El objeto sobre el que se definirán las propiedades.
props: el objeto cuyas propiedades enumerables o descriptores de propiedad modificados se van a definir.
Valor de retorno: el objeto pasado a la función.
El código de muestra es el siguiente:
var objeto = { nombre: 'atasco',}Object.defineProperties(obj, { 'edad': { valor: 28, grabable: verdadero, configurable: falso, enumerable: verdadero }, 'trabajo': { valor: 'abogado', grabable: verdadero, configurable: falso, enumerable: verdadero }, 'sexo': { valor: 'Hombre', grabable: falso, configurable: falso, enumerable: verdadero }, 'altura': { valor: '1,8 m', grabable: falso, configurable: falso, enumerable: verdadero }})console.log(obj) // nombre: 'jam', edad: 28, trabajo: 'abogado', sexo: 'masculino', altura: '1,8 m' }
Los descriptores de acceso son propiedades descritas por pares de funciones getter-setter. El descriptor de acceso tiene los siguientes valores clave opcionales:
get: proporciona un método getter para la propiedad. Si no hay getter, no está definido. Cuando se accede a esta propiedad, se ejecutará el método. No se pasan parámetros cuando se ejecuta el método, pero se pasa este objeto.
set: proporciona un método de establecimiento para la propiedad. Si no hay un establecimiento, no estará definido. Este método se activa cuando se modifica el valor de la propiedad. Este método aceptará el único parámetro, que es el nuevo valor del parámetro de la propiedad.
Configurable: si y solo si el atributo configurable es verdadero, el descriptor del atributo se puede cambiar y el atributo también se puede eliminar del objeto correspondiente. El valor predeterminado es falso.
Enurnerable: si y solo si el enurnerable del atributo es verdadero, el atributo puede aparecer en el atributo de enumeración del objeto. El valor predeterminado es falso.
El uso de configurable y enurnerable es consistente con el de los descriptores de datos, por lo que no los explicaré en detalle aquí.
Habla principalmente sobre el uso de métodos get y set.
var objeto = { nombre: 'mermelada', edad: 8, _dirección: 'Hebei' } // Escenarios de uso de descriptores de acceso // 1. Ocultar un determinado atributo privado que se espera que sea utilizado y asignado directamente por el mundo exterior // 2. Si queremos comprender el proceso de acceso y configuración del valor de un determinado atributo , también lo usaremos Descriptor de propiedad de almacenamiento Object.defineProperty(obj, 'address', { enumerable: verdadero, configurable: verdadero, obtener: función () { foo() devolver esta._dirección }, conjunto: función (valor) { bar() this._address = valor } }) función foo() { console.log("Se interceptó el valor de la dirección una vez") } barra de funciones () { console.log("El valor de la dirección se establece una vez") }
La consola de código de muestra anterior imprime los siguientes resultados: