¿Cuál es la diferencia entre esta sintaxis basada en constructor para crear un objeto?
person = new Object()
... y esta sintaxis literal:
person = {
property1 : "Hello"
};
Parece que ambos hacen lo mismo, aunque JSLint prefiere que use notación literal de objeto.
¿Cuál es mejor y por qué?
javascript
object
jslint
ectype
fuente
fuente
a = new Object
,a = new Object()
,a = {}
, literal es mucho más simple y algunas pruebas que corrió hace un tiempo dicen que es más rápido, más nuevos compiladores pueden haber causado mi declaración es falsa. Lo mismo se aplica a las matrices literalesvar
palabra clave en el código de su aplicación para evitar contaminar el espacio de nombres global y crear la necesidad de mirar más allá del registro actual en la pila para sus variables.new
es una convención que trasciende el punto sin sentido de un lenguaje mediocre. Úselonew
porque su significado es claro. En el 99,9% del caso, las ganancias de rendimiento son irrelevantes.Respuestas:
Ambos hacen lo mismo (a menos que alguien haya hecho algo inusual), aparte de eso, el segundo crea un objeto y le agrega una propiedad. Pero la notación literal ocupa menos espacio en el código fuente. Es claramente reconocible en cuanto a lo que está sucediendo, por lo que al usarlo
new Object()
, realmente solo está escribiendo más y (en teoría, si no está optimizado por el motor JavaScript) haciendo una llamada de función innecesaria.Estas
técnicamente no hago lo mismo. El primero solo crea un objeto. El segundo crea uno y asigna una propiedad. Para que el primero sea el mismo, necesita un segundo paso para crear y asignar la propiedad.
El "algo inusual" que alguien podría hacer sería sombrear o asignar al
Object
global predeterminado :En ese caso altamente inusual ,
new Object
fallará pero{}
funcionará.En la práctica, nunca hay una razón para usar en
new Object
lugar de{}
(a menos que hayas hecho algo muy inusual).fuente
()
new Object()
es obligatorio. (hablando de cosas no requeridas)No hay diferencia para un objeto simple sin métodos como en su ejemplo. Sin embargo, hay una gran diferencia cuando comienzas a agregar métodos a tu objeto.
Forma literal:
Forma de prototipo:
Ambas formas permiten la creación de instancias
Obj
como esta:Sin embargo, con la forma literal, llevas una copia del
sayHello
método dentro de cada instancia de tus objetos. Mientras que, con la forma del prototipo, el método se define en el prototipo del objeto y se comparte entre todas las instancias del objeto. Si tiene muchos objetos o muchos métodos, la forma literal puede conducir a un desperdicio de memoria bastante grande.fuente
new Object()
vs{}
para crear objetos vacíos.En JavaScript, podemos declarar un nuevo objeto vacío de dos maneras:
No he encontrado nada que sugiera que hay una diferencia significativa entre estos dos con respecto a cómo operan detrás de escena (corríjame si estoy equivocado, me encantaría saberlo). Sin embargo, el segundo método (usando la notación literal del objeto) ofrece algunas ventajas.
Considere un nuevo objeto que contiene los miembros Nombre y TelNo. Usando la nueva convención Object (), podemos crearla así:
La característica de propiedades de Expando de JavaScript nos permite crear nuevos miembros de esta manera sobre la marcha, y logramos lo que pretendíamos. Sin embargo, esta forma no es muy estructurada o encapsulada. ¿Qué pasaría si quisiéramos especificar los miembros en el momento de la creación, sin tener que depender de las propiedades de expansión y la asignación posterior a la creación?
Aquí es donde la notación literal del objeto puede ayudar:
Aquí hemos logrado el mismo efecto en una línea de código y significativamente menos caracteres.
Puede encontrar más información sobre los métodos de construcción de objetos anteriores en: JavaScript y Programación Orientada a Objetos (OOP).
Y finalmente, ¿qué pasa con el idiota que anuló a Object? ¿Creías que no era posible? Bueno, este JSFiddle demuestra lo contrario. El uso de la notación literal del objeto nos impide caer en esta bufonada.
(De http://www.jameswiseman.com/blog/2011/01/19/jslint-messages-use-the-object-literal-notation/ )
fuente
new Object()
debido a la posibilidad de que algo sobrescriba la función Objeto, también deberías escribir guardias por todas partes cuando uses ayudantesObject.keys
para asegurarte de que no esté indefinido, lo que desciende a lo absurdo. Siempre recomendaría que las personas usen la notación literal, pero creo que este argumento en particular se desmorona cuando piensas en las consecuencias de pensar de esa manera.En mi máquina usando Node.js, ejecuté lo siguiente:
Tenga en cuenta que esta es una extensión de lo que se encuentra aquí: ¿Por qué arr = [] es más rápido que arr = new Array?
mi salida fue la siguiente:
claramente {} y [] son más rápidos que usar new para crear objetos / matrices vacíos.
fuente
Todos aquí están hablando de las similitudes de los dos. Voy a señalar las diferencias.
Usar le
new Object()
permite pasar otro objeto. El resultado obvio es que el objeto recién creado se establecerá con la misma referencia. Aquí hay un código de muestra:El uso no se limita a los objetos como en los objetos OOP. También se le podrían pasar otros tipos. La función establecerá el tipo en consecuencia. Por ejemplo, si le pasamos el número entero 1, se creará un objeto de tipo número.
El objeto creado usando el método anterior (
new Object(1)
) se convertiría al tipo de objeto si se le agrega una propiedad.Si el objeto es una copia de una clase secundaria de objeto, podríamos agregar la propiedad sin la conversión de tipo.
fuente
str
es de tipo,string
por lo que no puede asignarle una propiedad. jsfiddle.net/grq6hdx7/1var obj = new Object("foo"); typeof obj; obj === "foo" // true
En realidad, hay varias formas de crear objetos en JavaScript. Cuando solo desea crear un objeto, no hay beneficio de crear objetos " basados en el constructor " utilizando el operador " nuevo ". Es lo mismo que crear un objeto usando la sintaxis " literal del objeto ". Pero los objetos " basados en constructores " creados con el operador " nuevo " tienen un uso increíble cuando piensas en " herencia prototípica ". No puede mantener la cadena de herencia con objetos creados con sintaxis literal. Pero puede crear una función de constructor , adjuntar propiedades y métodos a su prototipo."operador, devolverá un objeto que tendrá acceso a todos los métodos y propiedades adjuntas con el prototipo de esa función constructora.
Aquí hay un ejemplo de cómo crear un objeto usando la función de constructor (vea la explicación del código en la parte inferior):
Ahora, puede crear tantos objetos como desee instanciando la función de construcción Persona y todos ellos heredarán el nombre completo () de ella.
Nota: " esta " palabra clave se referirá a un objeto vacío dentro de una función de constructor y cada vez que cree un nuevo objeto desde Persona usando el operador " nuevo ", devolverá automáticamente un objeto que contiene todas las propiedades y métodos adjuntos con la palabra clave " este " . Y estos objetos seguramente heredarán los métodos y propiedades asociados con el prototipo de la función de constructor Persona (que es la principal ventaja de este enfoque).
Por cierto, si desea obtener la misma funcionalidad con la sintaxis " literal de objeto ", tendría que crear el nombre completo () en todos los objetos como se muestra a continuación:
Por último, si ahora pregunta por qué debería usar el enfoque de función de constructor en lugar del enfoque literal de objeto :
*** La herencia prototípica permite una simple cadena de herencia que puede ser inmensamente útil y poderosa.
*** Ahorra memoria al heredar métodos comunes y propiedades definidas en el prototipo de funciones de constructor. De lo contrario, tendría que copiarlos una y otra vez en todos los objetos.
Espero que esto tenga sentido.
fuente
Object.create(<object defined using literal notation>)
onew Object(<object defined using literal notation>)
y crear cadenas de herencia según sea necesario.function Person(firstname, lastname) { this.firstname = firstname; this.lastname = lastname; } Person.prototype.fullname = function() { console.log(this.firstname + ' ' + this.lastname); } var zubaer = new Person('Zubaer', 'Ahammed'); var john = new Person('John', 'Doe'); zubaer.fullname(); // Zubaer Ahammed john.fullname(); // John Doe zubaer.constructor.prototype.fullname = function() { console.log( 'Hello ' + this.firstname); } zubaer.fullname(); // Hello Zubaer john.fullname(); // Hoello John
Además, según algunos de los libros de JavaScript de O'Really ... (citado)
Otra razón para usar literales en lugar del constructor de objetos es que no hay una resolución de alcance. Debido a que es posible que haya creado un constructor local con el mismo nombre, el intérprete debe buscar la cadena de alcance desde el lugar al que está llamando Object () hasta encontrar el constructor global de Object.
fuente
He encontrado una diferencia, para ES6 / ES2015. No puede devolver un objeto utilizando la sintaxis de la función de flecha abreviada, a menos que rodee el objeto con
new Object()
.Esto se debe a que el compilador está confundido por los
{}
corchetes y piensa quen: i
es una etiqueta: construcción de declaración ; el punto y coma es opcional, por lo que no se queja.Si agrega otra propiedad al objeto, finalmente arrojará un error.
fuente
[1, 2, 3].map(v => { return {n: v}; });
dará lo mismo ...param => return_value
, y la diferencia entre usar{}
ynew Object()
en este caso.[1, 2, 3].map(v => ({n: v}));
Actualización 2019
Ejecuté el mismo código que @rjloura en mi nodo OSX High Sierra 10.13.6 versión 10.13.0 y estos son los resultados
fuente
El uso de la memoria es diferente si crea 10 mil instancias.
new Object()
solo conservará una copia y{}
conservará 10 mil copias.fuente
new
Crea un nuevo objeto. Ambos toman la misma cantidad de memoria.