JavaScript orientado a objetos (OOJS): 3 formas de crear instancias de objetos
Cuando un lenguaje de programación tiene que ver con objetos, lo primero que debemos aprender es cómo crear objetos . Crear objetos en JavaScript es bastante fácil: un par de llaves funcionará, sin embargo, esa no es la única forma de crear un objeto ni la única forma que alguna vez necesitará usar.
En JavaScript, las instancias de objetos se crean a partir de objetos integrados y se hacen realidad cuando el programa se está ejecutando. Por ejemplo, Date
es un objeto incorporado que nos brinda información sobre las fechas. Si queremos mostrar la fecha actual en una página, necesitamos una instancia de tiempo de ejecución de Date
que contenga la información sobre la fecha actual.
JavaScript también nos permite definir nuestros propios objetos que pueden producir sus propias instancias de objeto en tiempo de ejecución. En JavaScript, todo es un objeto y cada objeto tiene un ancestro final llamado Object
. La creación de una instancia de objeto se llama instanciación .
1. El new
operador
Uno de los métodos más comunes y más conocidos para crear una nueva instancia de objeto es mediante el uso del new
operador .
Necesita un constructor para que el new
operador funcione. Un constructor es un método de un objeto que reúne una nueva instancia de ese objeto . Su sintaxis básica se ve así:
nuevo constructor ()
Un constructor puede aceptar argumentos que pueden usarse para cambiar o agregar propiedades a la instancia de objeto que construye. El constructor tiene el mismo nombre que el objeto al que pertenece.
Aquí hay un ejemplo de cómo crear una instancia del objeto Date()
con la new
palabra clave:
dt = new Fecha (2017, 0, 1) console.log (dt) // dom 01 ene 2017 00:00:00 GMT + 0100
Date()
es el constructor para crear un nuevo objeto Date
. Diferentes constructores para un objeto toman diferentes argumentos para crear el mismo tipo de instancias de objeto con atributos variados .
No todos los objetos incorporados en JavaScript se pueden instanciar como Date
. Hay objetos que no vienen con un constructor : Math
, JSON
y Reflect
, pero siguen siendo objetos comunes.
Entre los objetos incorporados que tienen constructor (es), Symbol
no se puede llamar en el estilo del constructor para instanciar una nueva instancia de Symbol
. Solo se puede llamar como una función que devuelve un nuevo valor de Symbol
.
Además, entre los objetos incorporados que tienen constructor (es), no todos necesitan que sus constructores sean llamados con el new
operador para ser instanciados. Function
, Array
, Error
y RegExp
también se pueden llamar como funciones, sin usar la new
palabra clave, y crearán una instancia y devolverán una nueva instancia de objeto.
2. El objeto Reflect
Los programadores de back-end ya pueden estar familiarizados con Reflection APIs . La reflexión es una característica de los lenguajes de programación para inspeccionar y actualizar algunas de las entidades básicas, como objetos y clases, en tiempo de ejecución .
En JavaScript, ya puedes realizar algunas operaciones de reflexión usando Object
. Pero, una API Reflection adecuada llegó a existir en JavaScript también.
El objeto Reflect
tiene un conjunto de métodos para crear y actualizar instancias de objetos . El objeto Reflect
no tiene un constructor, por lo que no se puede crear una instancia con el new
operador y, al igual que Math
y JSON
, tampoco se puede llamar como una función .
Sin embargo, Reflect
tiene un equivalente del new
operador : el método Reflect.construct()
.
Reflect.construct (target, argumentsList [, newTarget])
Tanto el target
como el argumento opcional de newTarget
son objetos que tienen sus propios constructores, mientras argumentsList
es una lista de argumentos para pasar al constructor del target
.
var dt = Reflect.construct (Date, [2017, 0, 1]); console.log (dt); // dom 01 ene 2017 00:00:00 GMT + 0100
El código anterior tiene el mismo efecto que crear una instancia de Date()
usando el new
operador. Aunque todavía puede usar new
, Reflection es un estándar ECMAScript 6 . También le permite utilizar el argumento newTarget
, que es otra ventaja sobre el new
operador.
El valor del newTarget
de newTarget
(para ser exactos, es el prototipo del newTarget
de newTarget
) se convierte en el prototipo de la instancia recién creada .
Un prototipo es propiedad de un Objeto, cuyo valor también es un objeto, que lleva las propiedades del objeto original. En resumen, un objeto obtiene sus miembros de su prototipo.
Aquí, veamos un ejemplo:
clase A {constructor () {this.message = function () {console.log ('mensaje de A')}}} clase B {constructor () {} mensaje () {console.log ('mensaje de B') } data () {console.log ('data from B')}} obj = Reflect.construct (A, [], B) console.log (obj.message ()); // mensaje de A console.log (obj.data ()); // datos de B console.log (obj instanceof B) // true
Al pasar B
como el tercer argumento para Reflect.construct()
, el valor prototipo del objeto obj
se hace para ser igual que el prototipo del constructor de B
(que tiene el message
propiedades y los data
).
Por lo tanto, obj
puede acceder al message
y a los data
, disponibles en su prototipo. Pero, como obj
se hace usando A
, también tiene su propio message
que recibió de A
Aunque obj
se construye como una matriz, no es una instancia de Array
, porque su prototipo se establece en Object
.
obj = Reflect.construct (Array, [1, 2, 3], Object) console.log (obj) // Array [1, 2, 3] console.log (obj instanceof Array) // falso
Reflect.construct()
puede ser útil cuando desee crear un objeto utilizando más de un modelo .
3. El método Object.create()
También puede crear un nuevo objeto ordinario con un prototipo específico a través de Object.create()
. Esto también puede parecer muy similar al uso del new
operador, pero no lo es.
Object.create (O [, propertiesObject])
El argumento O
es un objeto que sirve al prototipo del nuevo objeto que se creará. El argumento opcional propertiesObject
es una lista de propiedades que quizás desee agregar al nuevo objeto.
clase A {constructor () {} mensaje () {consola.log ('mensaje de A')}} var obj = Object.create (nuevo A (), {data: {escribible: verdadero, configurable: verdadero, valor: function () {return 'data from obj'}}}) console.log (obj.message ()) // mensaje de A console.log (obj.data ()) // datos de obj obj1 = Object.create ( nuevo A (), {foo: {escribible: verdadero, configurable: verdadero, valor: función () {return 'foo de obj1'}}}) console.log (obj1.message ()) // mensaje de una consola. log (obj1.foo ()) // foo de obj1
En el objeto obj
, la propiedad añadida es data
, mientras que en obj1
, es foo
. Entonces, como puede ver, podemos tener propiedades y métodos agregados a un nuevo objeto .
Esto es excelente cuando desea crear varios objetos del mismo tipo pero con diferentes propiedades o métodos adicionales . La sintaxis Object.create()
ahorra el problema de codificar todos ellos por separado.
9 sitios para cursos gratuitos en línea y material didáctico abierto
Hoy en día, la educación ya no se limita al aula. Los avances de la tecnología y de Internet nos han permitido acceder a una amplia gama de materiales de aprendizaje digitales, así como a foros y comunidades en línea .Ahora hay muchas organizaciones o individuos que ofrecen cursos y materiales de aprendizaje gratuitos en línea, y hoy me gustaría llamar su atención sobre una lista de sitios web que ofrecen cursos gratuitos en línea y contenido de cursos abiertos para diferentes cursos de educación superior.Estos sit
15 lecciones "El arte de la guerra" te enseña sobre cómo ganar batallas de la vida
El Arte de la Guerra de Sun Tzu es ampliamente considerado por muchos como no solo una "biblia" para el campo de batalla, sino también una gran fuente de lecciones para la vida en general. La vida en sí misma es una lucha constante para, si no para mantenerse en la cima, al menos superar los desafíos diarios, mientras saca el máximo provecho de nuestros recursos .Suj