鍍金池/ 問答/Linux  HTML/ JS復(fù)制簡單問題

JS復(fù)制簡單問題

一個對象 foo 有一個屬性 baidu

var foo = {
    baidu:'woshibaidu'
    }

現(xiàn)在有一個對象 boo 引用了foo

    var boo = foo

所以此時,在boo里添加屬性,或者修改屬性,都會影響到foo,例如:此代碼會在foo和boo里同時增加一個屬性。

    boo.google = "imgoogle"

現(xiàn)在有問題來了。boo增加的google屬性,會在foo出現(xiàn),并且在boo修改時,foo內(nèi)也會改變,如何做到boo引用foo內(nèi)百度的值,但在foo內(nèi)無法修改boo內(nèi)google的值呢

回答
編輯回答
無標題

你直接這樣做的相當(dāng)于是對一個對象的做淺拷貝。對于一個對象來說,你這樣賦值是把boo指向了foo的堆里面(相可以想成:foo和boo指向同一個地址),所以你不論是改變foo還是boo都是改變的同一個東西。。。所以說如果你是只是要里面的值,你應(yīng)該用深拷貝的方式:

`

var foo = {
    baidu:'woshibaidu'
}
var boo = JSON.parse(JSON.stringify(foo));
boo.baidu = "newBaidu"
boo.google = "imgoogle";

console.log(foo)    // {baidu: "woshibaidu"}
console.log(boo)    // {baidu: "newBaidu", google: "imgoogle"}

`

這樣的方法便可以實現(xiàn)對象的深拷貝,但是有一個問題就是,如果你的對象里面有函數(shù)調(diào)用,就會跳過那個顯示。所以如果有那種情況只能用遞歸來實現(xiàn)一個對象的深拷貝

2017年5月20日 07:41
編輯回答
孤星

如果你是想直接克隆一個對象,完全獨立,如下:

function objClone(initalObj){
  var o = initalObj instanceof Array ? [] : {};
  for(var k in initalObj) {
    o[k] = (typeof(initalObj[k]) === 'object')&&(initalObj[k] != null) ? objClone(initalObj[k]) : initalObj[k];
  }
  return o;
}

var foo = {
  baidu:'woshibaidu'
};
var boo = objClone(foo);
boo.google = "imgoogle"; // foo.google為undefined
//foo與boo完全隔離,任何操作都不會有相互影響

如果你是想繼承一個對象,然后再做修改,如下

function deepPrototypeClone(obj) {
  const ret = Object.create(obj);
  for (const [key, value] of Object.entries(obj)) {
    if (value && typeof value === 'object') {
      ret[key] = deepPrototypeClone(value);
    }
  }
  return ret;
}

var foo = {
  baidu:'woshibaidu'
};
var boo = deepPrototypeClone(foo);
boo.google = "imgoogle"; // foo.google為undefinded
//boo不會影響foo,但foo會影響boo(如果foo的某個屬性沒被boo重新賦值過)
2018年2月13日 17:58
編輯回答
筱饞貓

這樣定義 boo 是不行的:

var boo = foo

這樣定義 boo 才能達到你說的效果:

var boo = {
    get baidu () {
        return foo.baidu
    },
    set baidu (val) {
        foo.baidu = val
    },
    google: 'imgoogle'
}

2017年3月28日 00:37