1 回答

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊
__ob__: Observer這些數(shù)據(jù)是vue這個(gè)框架對(duì)數(shù)據(jù)設(shè)置的監(jiān)控器,一般都是不可枚舉的。
console.log這樣的打印函數(shù),被打印的變量會(huì)執(zhí)行自身的toString(),這樣,即便內(nèi)部屬性是不可枚舉,實(shí)際上也能看到。舉個(gè)例子:
const obj = {
a: 0,
b: 1
};
Object.defineProperty(obj, 'b', {
writable: false,
enumerable: false,
configurable: false
});
console.log(obj); // Object {a: 0, b: 1}
因?yàn)槟阋呀?jīng)將數(shù)據(jù)綁定在了vue之中,vue就肯定要為數(shù)據(jù)添加監(jiān)控器的,如果你強(qiáng)制刪掉了這些監(jiān)控器,那么這些數(shù)據(jù)也就失去了監(jiān)控,那么你使用vue的意義何在……
如果僅僅是去掉這些監(jiān)控器而不考慮后果的話,把對(duì)象復(fù)制一份就行了,因?yàn)閺?fù)制的對(duì)象是不包含不可枚舉屬性的。
const obj1 = {
a: 0,
b: 1
};
Object.defineProperty(obj1, 'b', {
writable: false,
enumerable: false,
configurable: false
});
const obj2 = Object.assign({}, obj1);
console.log(obj2); // Object {a: 0}
js這類動(dòng)態(tài)語言,復(fù)制對(duì)象是個(gè)很頭疼的事情。我寫了個(gè)簡(jiǎn)單的,你可以參考一下:
//對(duì)象深復(fù)制,不考慮循環(huán)引用的情況
function cloneObj(from) {
return Object.keys(from)
.reduce((obj, key) => (obj[key] = clone(from[key]), obj), {});
}
//數(shù)組深復(fù)制,不考慮循環(huán)引用的情況
function cloneArr(from) {
return from.map((n) => clone(n));
}
// 復(fù)制輸入值
function clone(from) {
if (from instanceof Array) {
return cloneArr(from);
} else if (from instanceof Object) {
return cloneObj(from);
} else {
return (from);
}
}
const obj = [
{
name: '1'
},
{
name: '2'
}
];
const obj2 = clone(obj);
console.log(obj2);
在外面直接用clone()方法就行了。
添加回答
舉報(bào)