Me estoy confundiendo sobre de qué manera debería crear un objeto en javascript. Parece que hay al menos dos formas. Uno es usar la notación literal de objeto mientras que el otro usa funciones de construcción. ¿Hay alguna ventaja de uno sobre el otro?
javascript
chobo
fuente
fuente
Respuestas:
Si no tiene un comportamiento asociado con un objeto (es decir, si el objeto es solo un contenedor de datos / estado), usaría un objeto literal.
Aplica el principio KISS . Si no necesita nada más que un simple contenedor de datos, elija un literal simple.
Si desea agregar comportamiento a su objeto, puede ir con un constructor y agregar métodos al objeto durante la construcción o darle a su clase un prototipo.
Una clase como esta también actúa como un esquema para su objeto de datos: ahora tiene algún tipo de contrato (a través del constructor) sobre las propiedades que el objeto inicializa / contiene. Un literal gratuito es solo una masa amorfa de datos.
También podría tener una
verify
función externa que actúe sobre un objeto de datos antiguo simple:Sin embargo, esto no es favorable con respecto a la encapsulación: idealmente, todos los datos + comportamiento asociados con una entidad deberían convivir.
fuente
this.fn = function ...
enfoque en un constructor, cada una de sus instancias de objeto tendrá sus propias copias de funciones. Usando el enfoque de prototipo, adjunta cada función una vez y solo una vez: las instancias las heredarán a través de la herencia de prototipos.Básicamente, se reduce a si necesita varias instancias de su objeto o no; El objeto definido con un constructor le permite tener varias instancias de ese objeto. Los literales de objeto son básicamente singleton con variables / métodos que son todos públicos.
fuente
Otra forma de crear objetos de manera uniforme es usar una función que devuelva un objeto:
Dado que las funciones en JavaScript son cierres, podemos usar variables y métodos privados y evitar
new
.De http://javascript.crockford.com/private.html sobre variables privadas en JavaScript.
fuente
El código siguiente muestra tres métodos para crear un objeto, sintaxis literal de objeto, un constructor de funciones y
Object.create()
. La sintaxis literal de objeto simplemente crea un objeto sobre la marcha y, como tal,__prototype__
es elObject
objeto y tendrá acceso a todas las propiedades y métodos deObject
. Estrictamente desde la perspectiva de un patrón de diseño, se debe usar un literal de objeto simple para almacenar una única instancia de datos.El constructor de funciones tiene una propiedad especial llamada
.prototype
. Esta propiedad se convertirá en la propiedad__prototype__
de cualquier objeto creado por el constructor de la función. Todas las propiedades y métodos agregados a la.prototype
propiedad de un constructor de funciones estarán disponibles para todos los objetos que crea. Se debe usar un constructor si necesita múltiples instancias de los datos o requiere el comportamiento de su objeto. Tenga en cuenta que el constructor de funciones también se utiliza mejor cuando desea simular un patrón de desarrollo público / privado. Recuerde poner todos los métodos compartidos en el.prototype
para que no se creen en cada instancia de objeto.La creación de objetos con
Object.create()
utiliza un objeto literal como__prototype__
para los objetos creados por este método. Todas las propiedades y métodos agregados al objeto literal estarán disponibles para todos los objetos creados a partir de él a través de una verdadera herencia de prototipos. Este es mi método preferido.fuente
Object.create
la función dentro del literal será único por instancia?Depende de lo que quieras hacer. Si desea utilizar variables o funciones (semi) privadas en su objeto, una función de constructor es la forma de hacerlo. Si su objeto solo contiene propiedades y métodos, un objeto literal está bien.
Ahora el método
multiply5
enmyObj
ySomeLiteral
hacer exactamente lo mismo. La única diferencia es que myObj usa una variable privada. Este último puede resultar útil en algunos casos. La mayoría de las veces, un objeto literal es suficiente y una forma agradable y limpia de crear un objeto JS.fuente
¿Quiere una sola instancia del objeto para la página? Literal.
¿Desea simplemente transferir datos como objetos DTO simple GET SET: - Literal
¿Quieres crear objetos reales con comportamientos de métodos, múltiples instancias? - Función de constructor, Seguir los principios de OOP, herencia: - Funciones de constructor.
A continuación se muestra el video de youtube que explica en detalle qué es literal, qué son las funciones del constructor y en qué se diferencian entre sí.
https://www.youtube.com/watch?v=dVoAq2D3n44
fuente
Vaya con el objeto literal, es más coherente y se expande mejor con la introducción de valores iniciales.
fuente
Como se menciona en https://www.w3schools.com/js/js_object_definition.asp
también
fuente
JavaScript orientado a objetos de Udacity
fuente
En realidad, creo que podemos tener métodos privados en literales de objeto. Considere el código a continuación:
Es una cuestión de gusto, pero prefiero usar literales de objeto donde sea posible.
fuente
// Literal de objeto y constructor de objeto
fuente