fundo
Tenho uma função que usa um config
objeto como argumento. Dentro da função, também tenho default
objeto. Cada um desses objetos contém propriedades que funcionam essencialmente como configurações para o resto do código dentro da função. A fim de evitar ter que especificar todas as configurações dentro do config
objeto, eu uso o extend
método jQuery para preencher um novo objeto, settings
com quaisquer valores padrão do default
objeto, se eles não foram especificados no config
objeto:
var config = {key1: value1};
var default = {key1: default1, key2: default2, key 3: default 3};
var settings = $.extend(default, config);
//resulting properties of settings:
settings = {key1: value1, key2: default2, key 3: default 3};
Problema
Isso funciona muito bem, mas eu gostaria de reproduzir essa funcionalidade sem a necessidade do jQuery. Existe um meio igualmente elegante (ou próximo de) para fazer isso com o velho javascript?
Editar: Justificativa Não Duplicada
Esta pergunta não é uma duplicata da pergunta " Como posso mesclar propriedades de dois objetos JavaScript dinamicamente? " Considerando que essa questão deseja simplesmente criar um objeto que contém todas as chaves e valores de dois objetos separados - eu quero especificamente abordar como fazer isso no caso de ambos os objetos compartilharem algumas, mas não todas as chaves e qual objeto terá precedência ( o padrão) para o objeto resultante no caso de haver chaves duplicadas. E ainda mais especificamente, eu queria abordar o uso do método jQuery para conseguir isso e encontrar uma maneira alternativa de fazer isso sem jQuery. Embora muitas das respostas a ambas as perguntas se sobreponham, isso não significa que as próprias perguntas sejam as mesmas.
fonte
jQuery.isPlainObject
ejQuery.isFunction
Respostas:
Para obter o resultado em seu código, você faria:
Lembre-se de que a maneira como você usou extender irá modificar o objeto padrão. Se você não quer isso, use
Uma solução mais robusta que imita a funcionalidade do jQuery seria a seguinte:
fonte
Você pode usar Object.assign.
Ele copia os valores de todas as propriedades próprias enumeráveis de um ou mais objetos de origem para um objeto de destino e retorna o objeto de destino.
Ele funciona em todos os navegadores de desktop, exceto o IE (mas incluindo o Edge). Tem suporte móvel mitigado.
Veja você mesmo aqui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Sobre cópia profunda
No entanto, Object.assign não tem a opção deep que o método extend do jQuery tem.
Nota: você geralmente pode usar JSON para um efeito semelhante, embora
fonte
Você pode usar o operador de propagação ECMA 2018 em literais de objeto ...
Suporte BabelJS para navegadores mais antigos
fonte
Esta é a minha abordagem ligeiramente diferente com cópia profunda que criei ao tentar eliminar uma dependência do jQuery. Ele foi projetado principalmente para ser pequeno, então pode não ter todos os recursos que você espera. Deve ser totalmente compatível com ES5 (a partir do IE9 devido ao uso de Object.keys ):
Você pode se perguntar o que a quinta linha faz exatamente ... Se obj2.key for um objeto literal (ou seja, se não for um tipo comum), chamamos recursivamente de extender nele. Se uma propriedade com esse nome ainda não existe em obj1, nós a inicializamos como um objeto vazio primeiro. Caso contrário, simplesmente definimos obj1.key como obj2.key.
Aqui estão alguns dos meus testes de mocha / chai que devem provar que os casos comuns funcionam aqui:
Eu ficaria feliz com feedback ou comentários sobre esta implementação. Desde já, obrigado!
fonte
Você pode percorrer as propriedades do objeto usando a
for
instrução.fonte
a
. Embora não esteja no exemplo,$.extend
na verdade funciona dessa forma, mesclando todas as propriedades de todos os objetos.Eu prefiro este código que usa meu forEachIn genérico e não destrói o primeiro objeto:
Se você realmente deseja mesclar coisas no primeiro objeto, pode fazer:
fonte
Isso me ajuda muito quando eu desenvolvo com javascript puro.
fonte
A abordagem de Ivan Kuckir também pode ser adaptada para criar um novo protótipo de objeto:
fonte