为什么在Javascript中.clone()会搞乱克隆对象的方法?

62 阅读1分钟

在javascript中,克隆是将一个对象的属性复制到另一个对象,以避免创建一个已经存在的对象。

有几种方法来克隆一个javascript对象。

  1. 遍历每一个属性并将它们复制到一个新的对象。

  2. 使用JSON方法。

  3. 使用object.assign()方法。

遍历每一个属性并将它们复制到一个新的对象中。

这是一个克隆javascript对象的老方法,其中每一个属性都将被迭代并复制到一个新的对象中。这是一个简单的方法,但很少被使用。

例子

<html>
<body>
<script>
function mSort (array) {
if (array.length === 1) {
return array // return once we hit an array with a single item
}
const middle = Math.floor(array.length / 2) // get the middle item of the array rounded down
const left = array.slice(0, middle) // items on the left side
const right = array.slice(middle) // items on the right side
return merge(
mSort(left),
mSort(right)
)
}
// compare the arrays item by item and return the concatenated result
function merge (left, right) {
let result = []
let leftIndex = 0
let rightIndex = 0
while (leftIndex < left.length && rightIndex < right.length) {
if (left[leftIndex] < right[rightIndex]) {
result.push(left[leftIndex])
leftIndex++

} else {
result.push(right[rightIndex])
rightIndex++ 
}
}
return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex))
}
const list = [4,7,5,9,1,3,8,2,10]
document.write(mSort(list));
</script>
</body>
</html>

OUTPUT

1,2,3,4,5,7,8,9,10

JSON方法

在这个方法中,源对象必须是安全的JSON格式。

例子

<html>
<body>
<p id="clone-2"></p>
<script>
const sourceObject = {name:"salman", age:23, salary:25000};
let requiredObj = {};
requiredObj = JSON.parse(JSON.stringify(sourceObject));
document.getElementById("clone-2").innerHTML =
"targetObject name = "+requiredObj.name+", age = " + requiredObj.age+", salary = "+requiredObj.salary;
</script>
</body>
</html>

OUTPUT

targetObject name = salman, age = 23, salary = 25000

Object.assign():
现在经常使用的高级方法是克隆javascript对象。这个方法只不过是浅层复制,这意味着嵌套的属性仍然是通过引用复制的。

例子

<html>
<body>
<p id="clone-3"></p>
<script>
const sourceObject = {name:"marieya", age:23, salary:25000};
let requiredObj = {};
requiredObj = Object.assign({}, sourceObject);
document.getElementById("clone-3").innerHTML =
"targetObject name = "+requiredObj.name+", age = " + requiredObj.age+",salary"+requiredObj.salary;
</script>
</body>
</html>

OUTPUT:

targetObject name = marieya, age = 23,salary25000