Typescript/Angular/ES6: ¿puedo finalmente dejar que `hasOwnProperty()` muera en los ciclos for?
Siempre me ha disgustado la necesidad de verificar hasOwnProperty() al recorrer objetos en JavaScript:
for ( var key in object ) {
if ( !object.hasOwnProperty( key ) ) {
continue;
}
// Now I can do whatever I needed to do
}
Siempre parece un desperdicio de espacio vertical recorrer las claves de un objeto y luego tener que verificar explícitamente que esas claves no provengan de otro lugar. Obviamente, estoy familiarizado con por qué esto era necesario en JavaScript, especialmente debido a bibliotecas antiguas que a veces inyectaban cosas en la cadena de prototipos (cough Prototype cough).
Sin embargo, hasta donde yo sé, Angular no hace tal cosa. Typescript ciertamente tampoco tendría motivo para hacerlo. No puedo imaginar que ningún framework moderno de JavaScript lo hiciera. Como resultado, ¿cuáles son los posibles inconvenientes de omitir tal verificación en una aplicación moderna de Angular (o en cualquier aplicación moderna de JavaScript)? ¿Estoy solo en riesgo de problemas causados por mi propio equipo modificando accidentalmente los prototipos (o importando accidentalmente librerías que modifican prototipos), o hay más posibilidades de problemas que desconozco? ¿De qué otras maneras podría afectarme la cadena de prototipos si intento simplemente hacer esto?
for ( let key in object ) {
}
Mis propias pruebas no han revelado ningún problema, pero puede que esté pasando algo obvio por alto. Y sí, estoy al tanto de Object.keys( object ) en JS/TS moderno. Hace el trabajo, pero no creo que sea tan limpio como un for ... in, que es lo que preferiría usar si puedo dejar que hasOwnProperty() muera.
Respuesta #1
No hay absolutamente ninguna razón para incluir esta verificación al enumerar objetos simples y otros que sabes que no tienen propiedades heredadas enumerables. Tienes razón, ningún framework moderno razonable hace esto con Object.prototype.
La muerte de las comprobaciones de hasOwnProperty ha sido proclamada desde 2012 :-)
¿Estoy en riesgo únicamente de problemas causados por mi propio equipo modificando accidentalmente prototipos (o importando accidentalmente bibliotecas que modifican prototipos)?
Sí. Aunque la solución para tales problemas no es modificar los prototipos (o hacer que la propiedad no sea enumerable), ni agregar comprobaciones de hasOwnProperty en todas partes.
¿O hay más espacio para problemas del que no estoy al tanto?
No.
En realidad, omitir la verificación if (!object.hasOwnProperty(key)) podría incluso resolver algunos problemas y evitar inconvenientes. No todos los objetos que podrías querer enumerar tienen garantizado un método hasOwnProperty, o uno que haga lo que esperas. La manera correcta de verificar, en los casos en que sea necesario, siempre ha sido con call:
if (!Object.prototype.hasOwnProperty.call(object, key))
(aunque por supuesto todavía hay casos extremos, pero no dependen de object)
