Não sei quando começou, mas uma nova palavra apareceu no círculo de front-end: clonagem de profundidade do objeto. Parece muito alto, mas não é novo na verdade. Você pode tê -lo usado em nosso desenvolvimento real do projeto, mas devido à profunda parte dos personagens chineses, algumas coisas originalmente simples se tornam misteriosas por um pouco modificado por algum vocabulário aparentemente profissional.
Primeiro de tudo, por que você precisa clonar profundamente um objeto? Permita-me adivinhar: às vezes você pensa que o documento de objeto embutido do JS é muito longo, então você pode fazer isso:
A cópia do código é a seguinte:
var d = documento;
d.by = function (id) {
retorno d.getElementById (ID);
};
d.by ('id'). innerhtml = 'hello sentsin';
O código acima simplifica document.getElementById e também adiciona um método por membro ao objeto de documento original. Você pode verificar seu julgamento usando o valor de status retornado pelo document.HasownProperty ('por'). Vamos dar uma olhada no exemplo a seguir.
A cópia do código é a seguinte:
var pessoa = {nome: 'xianxin', profissão: 'desenvolvimento de front-end', local: 'hangzhou'};
var newPerson = pessoa;
newPerson.age = '24';
console.log (pessoa);
// Resultado: {name: 'xianxin', profissão: 'desenvolvimento de front-end', lugar: 'hangzhou', idade: 24}}
Pode -se observar que, quando um objeto é simplesmente passado para uma nova variável, é simplesmente um alias para o objeto. Isso significa que o valor da chave do objeto original mudará através da operação no alias. Mas o problema é que, às vezes, queremos que o NewPerson seja completamente independente da pessoa e não há relação de sincronização entre si, por isso precisamos gerar uma cópia, consulte o exemplo:
A cópia do código é a seguinte:
var cloneobj = function (obj) {
var str, newobj = obj.constructor === Array? []: {};
if (typeof obj! == 'objeto') {
retornar;
} else if (window.json) {
str = json.stringify (obj), // objeto serializado
newobj = json.parse (str); //Restaurar
} outro {
para (var i em obj) {
newobj [i] = typeof obj [i] === 'objeto'?
cloneobj (obj [i]): obj [i];
}
}
retornar newobj;
};
//teste
var obj = {a: 0, b: 1, c: 2};
var arr = [0, 1, 2];
// Executa a clonagem profunda
var newobj = cloneobj (obj);
var newarr = cloneobj (arr);
// Remova a exclusão do membro do novo objeto
excluir newobj.a;
newarr.splice (0,1);
console.log (Obj, arr, newobj, newarr);
// resultado: {a: 0, b: 1, c: 2}, [0, 1, 2], {b: 1, c: 2}, [1, 2];
Esta é a chamada clonagem de objeto. Mas há algumas coisas que precisam ser explicadas. O objeto JSON e seus métodos de membro se rastreiam e analisam o código pertencem à especificação ECMAScript5. Eles são responsáveis por converter um objeto (incluindo objetos de matriz) em strings e restaurá -los, percebendo assim uma cópia profunda do objeto. Portanto, para navegadores de baixo nível (como o IE), se você copiar matrizes, poderá usar newobj.concat (obj) e objetos comuns podem simplesmente enumerar e atribuir valores.