Typescript / Angular / ES6: posso finalmente lasciare che `hasOwnProperty ()` muoia in loop per?

Non ho mai apprezzato la necessità di controllare hasOwnProperty() durante il loop su oggetti in javascript:

 for ( var key in object ) { if ( !object.hasOwnProperty( key ) ) { continue; } // Now I can do whatever I needed to do } 

Sembra sempre uno spazio vuoto sprecato per scorrere le chiavi in ​​un object e quindi controllare esplicitamente per assicurarsi che quelle chiavi non provengano da qualche altra parte. Ovviamente ho familiarità con il motivo per cui è stato necessario in javascript, soprattutto a causa di librerie più vecchie che a volte iniettavano cose nella catena del prototipo ( tosse prototipo della tosse ).

Tuttavia, per quanto ne so, l’angular non fa nulla del genere. Il typescript certamente non avrebbe avuto motivo per nessuno dei due. Non riesco a immaginare una struttura javascript moderna. Di conseguenza, quali sono i lati negativi possibili di saltare tale controllo in una moderna app Angolare (o in qualsiasi app javascript moderna). Sono solo a rischio di problemi causati dalla mia stessa squadra che modifica accidentalmente i prototipi (o accidentalmente importa le librerie che modificano i prototipi) o c’è più spazio per problemi di cui non sono a conoscenza? In quali altri modi la catena del prototipo potrebbe mordermi se provo a farlo?

 for ( let key in object ) { } 

I miei test non hanno rivelato alcun problema, ma potrei mancare qualcosa di ovvio. E sì, sono a conoscenza di Object.keys( object ) in mondern js / ts. Ottiene il lavoro fatto, ma non credo sia pulito come un for ... in , che è quello che preferirei usare se potessi lasciare hasOwnProperty() morire.

Non c’è assolutamente alcun motivo per includere questo controllo quando si enumerano oggetti semplici e altri che si sa non hanno proprietà ereditate enumerabili. Hai ragione, nessun quadro moderno ragionevole lo fa a Object.prototype .

La morte dei controlli hasOwnProperty è stata proclamata dal 2012 🙂

Sono solo a rischio di problemi causati dalla mia stessa squadra che modifica accidentalmente i prototipi (o importando accidentalmente le librerie che modificano i prototipi)?

Sì. Sebbene la correzione di tali problemi non sia quella di modificare i prototipi (o di rendere la proprietà non enumerabile ), non aggiungere controlli hasOwnProperty ovunque.

O c’è più spazio per problemi di cui non sono a conoscenza?

No.

In realtà, l’omissione del controllo if (!object.hasOwnProperty(key)) potrebbe persino risolvere alcuni problemi ed evitare problemi. Non tutti gli oggetti che si desidera enumerare sono garantiti per avere un metodo hasOwnProperty o uno che fa ciò che si aspetta. Il modo corretto per verificare – nei casi in cui è necessario – è sempre stato con la call :

 if (!Object.prototype.hasOwnProperty.call(object, key)) 

(anche se ovviamente ci sono ancora casi limite , ma non dipendono object )