Conozco muchas formas de crear objetos JS pero no sabía cuál era Object.create(null)
.
Pregunta:
¿Es exactamente lo mismo que:
var p = {}
vs
var p2 = Object.create(null);
?
fuente
Conozco muchas formas de crear objetos JS pero no sabía cuál era Object.create(null)
.
Pregunta:
¿Es exactamente lo mismo que:
var p = {}
vs
var p2 = Object.create(null);
?
No son equivalentes. {}.constructor.prototype == Object.prototype
while Object.create(null)
no hereda de nada y, por lo tanto, no tiene propiedades en absoluto.
En otras palabras: JavaScript Object hereda un objeto de forma predeterminada, a menos que se crea explícitamente con null como su prototipo, como: Object.create(null)
.
{}
en cambio sería equivalente a Object.create(Object.prototype)
.
En Chrome Devtool puede ver que Object.create(null)
no tiene __proto__
propiedad, mientras que {}
sí.
Definitivamente no son equivalentes. Estoy escribiendo esta respuesta para explicar más completamente por qué hace la diferencia.
var p = {};
Crea un objeto que hereda las propiedades y métodos de Object
.
var p2 = Object.create(null);
Crea un objeto que no hereda nada.
Si está utilizando un objeto como mapa, y crea un objeto utilizando el método 1 anterior, debe tener mucho cuidado al realizar búsquedas en el mapa. Debido a que las propiedades y métodos de Object
se heredan, su código puede encontrarse con un caso en el que hay claves en el mapa que nunca insertó. Por ejemplo, si realiza una búsqueda toString
, encontrará una función, aunque nunca ponga ese valor allí. Puedes solucionarlo así:
if (Object.prototype.hasOwnProperty.call(p, 'toString')) {
// we actually inserted a 'toString' key into p
}
Tenga en cuenta que está bien asignar algo p.toString
, simplemente anulará la toString
función heredada p
.
Tenga en cuenta que no puede hacerlo simplemente p.hasOwnProperty('toString')
porque puede haber insertado una clave "hasOwnProperty" p
, por lo que lo forzamos a usar la implementación en Object
.
Por otro lado, si usa el método 2 anterior, no tendrá que preocuparse de que Object
aparezcan cosas en el mapa.
No puede verificar la existencia de una propiedad con un simple if
como este:
// Unreliable:
if (p[someKey]) {
// ...
}
El valor podría ser una cadena vacía, podría ser false
, o null
, o undefined
, 0
o NaN
, etc. Para verificar si existe alguna propiedad, aún necesitaría usarla Object.prototype.hasOwnProperty.call(p, someKey)
.
if (someKey in p) {
Object.create(null)
. Prefiero no hacer suposiciones como esa, incluso si tuviera toda la razón de que lo usaraObject.create(null)
, el código podría cambiar, el objeto podría reemplazarse por uno que heredeObject
en algún momento.hasOwnProperty
siempre funciona{}
es mucho más frecuente queObject.create(null)
, si su código toma accidentalmente una propiedad heredada en este punto, es probable que tenga que preocuparse de errores mucho más grandes. Solo puedo ver personas que usan Object.create (nulo) como una optimización menor.!!p[key]
funciona bien conObject.create(null)
. PerohasKey = (key, input) => Object.prototype.hasOwnProperty.call(input, key)
tampoco está malp
porque cada método podría insertarse y, por lo tanto, no ser seguro.La creación de objetos mediante el uso
{}
creará un objeto cuyo prototipo es elObject.prototype
que hereda las funciones básicas delObject
prototipo, mientras que la creación de objetos mediante el usoObject.create(null)
creará un objeto vacío cuyo prototipo es nulo.fuente
Si alguien está buscando implementar
Object.create(null)
, solo para saber cómo funciona. Está escrito usando lo__proto__
que no es estándar y, por lo tanto, no lo recomiendo .Nota : Escribí esto, por curiosidad, y solo está escrito en términos simples, por ejemplo, no estoy transfiriendo los descriptores de propiedad del segundo objeto al objeto de retorno.
fuente
__proto__
ahora será oficialmente parte del lenguaje.-1
enarguments.length>0?arguments[0]:-1;
?Object
prototipo se conserve si no se da el primer argumento. Los nombres de las variables podrían ser mucho mejores aquí.Cuando crea un Objeto con Object.create (nulo) eso significa que está creando un Objeto sin prototipo. nulo aquí significa el final de la cadena del prototipo. Sin embargo, cuando cree un objeto como {} se agregará un prototipo de objeto. Por lo tanto, estos son dos objetos diferentes, uno con prototipo y otro sin prototipo. Espero que esto ayude
fuente