物件的淺拷貝,包括拷貝物件原型的屬性
阿新 • • 發佈:2019-01-12
const s = Symbol('s'); // 測試物件 const test = { num: 0, str: '', boolean: true, unf: undefined, nul: null, obj: { name: '我是一個物件', id: 1, innerObj: { name: '我是物件的物件', id: 1.1 } }, arr: [0, 1, 2], date: new Date('1996/03/03'), reg: new RegExp(/我是一個正則/ig), err: new Error('我是一個錯誤'), [s]: '我的key是Symbol', noEnumerable: '我是手動設定的不可列舉屬性', func() { console.log('我是一個函式'); }, get num1() { return this.num; }, set num1(val) { this.num = val } }; Object.defineProperty(test, 'noEnumerable', {enumerable: false}); // 建立一個新物件,使用現有的物件來提供新建立的物件的_proto_ const testChild = Object.create(test);
#. 以下列出的no與yes是判斷是否可拷貝列出的屬性
1. 寫法一
繼承的可列舉屬性 (yes)
自身的不可列舉屬性 (no)
自身的Symbol屬性 (yes)
const clone1 = {
__proto__: Object.getPrototypeOf(test),
...test
}
const clone2 = {
__proto__: Object.getPrototypeOf(testChild),
...test
}
2. 寫法二
繼承的可列舉屬性 (yes)
自身的不可列舉屬性 (no)
自身的Symbol屬性 (yes)
const clone3 = Object.assign(
Object.create(Object.getPrototypeOf(test)),
test
);
const clone4 = Object.assign(
Object.create(Object.getPrototypeOf(testChild)),
test
);
3. 寫法三
繼承的可列舉屬性 (no)
自身的不可列舉屬性 (yes)
正確的拷貝getter與setter (yes)
自身的Symbol屬性 (yes)
const clone5 = Object.create( Object.getPrototypeOf(test), Object.getOwnPropertyDescriptors(test) ) const clone6 = Object.create( Object.getPrototypeOf(testChild), Object.getOwnPropertyDescriptors(testChild) )