Estou cansado de sempre ter que escrever um código como este:
function shallowExtend(obj1,obj2){
var key;
for ( key in obj2 ) {
if ( obj2.hasOwnProperty(key) === false ) continue;
obj1[key] = obj2[key]
}
}
Ou, se eu não quiser escrever o código, implemente uma biblioteca que já o faça. Certamente o ES6 + está vindo para o resgate, pois isso nos fornecerá algo como um Object.prototype.extend(obj2...)
ouObject.extend(obj1,obj2...)
Então, o ES6 + fornece essa funcionalidade? Se ainda não estiver lá, essa funcionalidade está planejada? Se não for planejado, por que não?
javascript
ecmascript-6
Balupton
fonte
fonte
[[Prototype]]
cadeia? Você faz cópias "profundas" ou "rasas"? E as propriedades não enumeráveis e não graváveis? Eu acho que prefiro ter uma pequena função de biblioteca que faça o que eu preciso e, principalmente, é evitável de qualquer maneira.Respostas:
Você poderá fazer uma mesclagem / extensão / atribuição superficial no ES6 usando Object.assign:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Sintaxe:
onde ... sources representa o (s) objeto (s) de origem.
Exemplo:
fonte
let merged = Object.assign({}, source1, source2);
Object.assign
: ver a minha resposta aquiJSON.parse(JSON.stringify(src))
Você pode usar a sintaxe de propagação do objeto para isso:
Para matrizes, o operador de propagação já fazia parte do ES6 (ES2015), mas, para objetos, foi adicionado à especificação de idioma no ES9 (ES2018). Sua proposta foi ativada por padrão em ferramentas como Babel muito antes disso.
fonte
const ob1 = {foo: 123}; const ob2 = {bar: 234}; const merged = {...ob1, ...ob2}; console.log(merged)
Saída:{ foo: 123, bar: 234 }
Sei que esse é um problema antigo, mas a solução mais fácil no ES2015 / ES6 é realmente bastante simples, usando Object.assign (),
Espero que isso ajude, isso também faz a DEEP :
Exemplo de uso:
fonte
A adição de
Object.mixin
está sendo discutida no momento para cuidar do comportamento que você está solicitando. https://mail.mozilla.org/pipermail/es-discuss/2012-December/027037.htmlEmbora ainda não esteja no rascunho do ES6, parece que há muito apoio para ele, então acho que ele aparecerá nos rascunhos em breve.
fonte
.mixin
foi descartado pelo TC39.ES6
ES7 ou Babel
fonte
Talvez o
Object.defineProperties
método ES5 faça o trabalho?por exemplo
Documentação do MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties
fonte
defineProperties
define propriedades próprias. Ele não substitui propriedades na[[prototype]]
cadeia, mas as obscurece.Object.getOwnPropertyDescriptor
também para definir a propriedade quando for um valor complexo ou você copiará por referência.