Perf também é uma razão. Às vezes, você pode precisar fazer um loop sobre as teclas. Existem várias maneiras de fazer isso
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
Eu costumo usar for of Object.keys()como ele faz a coisa certa e é relativamente concisa, não há necessidade de adicionar a verificação.
Mas, é muito mais lento .

Apenas supor que o motivo Object.keysé lento é óbvio, Object.keys()tem que fazer uma alocação. De fato, o AFAIK precisa alocar uma cópia de todas as chaves desde então.
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
É possível que o mecanismo JS possa usar algum tipo de estrutura de chave imutável, para que Object.keys(object)retorne uma referência que itere sobre chaves imutáveis e que object.newPropcrie um objeto de chaves imutáveis totalmente novo, mas seja o que for, é claramente mais lento em até 15x
Até a verificação hasOwnPropertyé até 2x mais lenta.
O ponto de tudo isso é que, se você tiver um código sensível ao desempenho e precisar fazer um loop sobre as chaves, poderá usar for insem precisar chamar hasOwnProperty. Você só pode fazer isso se não tiver modificadoObject.prototype
observe que se você Object.definePropertymodificar o protótipo se as coisas adicionadas não forem enumeráveis, elas não afetarão o comportamento do JavaScript nos casos acima. Infelizmente, pelo menos no Chrome 83, eles afetam o desempenho.

Adicionei 3000 propriedades não enumeráveis apenas para tentar forçar a exibição de quaisquer problemas de perf. Com apenas 30 propriedades, os testes foram muito próximos para dizer se houve algum impacto no desempenho.
https://jsperf.com/does-adding-non-enumerable-properties-affect-perf
O Firefox 77 e o Safari 13.1 não mostraram diferença no perf entre as classes Augmented e Unaugmented. Talvez a v8 seja corrigida nessa área e você possa ignorar os problemas de perf.
Mas deixe-me acrescentar que há a história deArray.prototype.smoosh . A versão curta é a Mootools, uma biblioteca popular, criada por eles mesmos Array.prototype.flatten. Quando o comitê de padrões tentou adicionar um nativo, Array.prototype.flatteneles encontraram o impossível sem quebrar muitos sites. Os desenvolvedores que descobriram sobre o intervalo sugeriram nomear o método es5 smooshcomo uma piada, mas as pessoas se assustaram ao não entender que era uma piada. Eles se estabeleceram em flatvez deflatten
A moral da história é que você não deve estender objetos nativos. Caso contrário, você poderá encontrar o mesmo problema de quebra de suas coisas e, a menos que sua biblioteca em particular seja tão popular quanto o MooTools, é improvável que os fornecedores de navegadores contornem o problema que você causou. Se a sua biblioteca ficar tão popular, seria meio que forçar todo mundo a solucionar o problema que você causou. Portanto, não estenda objetos nativos