ES6 -- 新內建方法取代舊內建方法: 複製物件屬性
當我們想把2個物件複製到一個物件中,
在ES5, 會用Object.keys() & forEach()寫:
e.g.
var dst = {quux: 0};
var src1 = {foo: 1, bar: 2};
var src2 = {foo: 3, baz: 4};
Object.keys(src1).forEach(function(k) {
dst[k] = src1[k]; // 將src1這陣列的值複製到dst物件上
});
Object.keys(src2).forEach(function(k) {
dst[k] = src2[k]; // 將src2這陣列的值複製到dst物件上
});
console.log(dst); // Object {quux: 0, foo: 3, bar: 2, baz: 4}
在ES6可用Object.assign()這個新語法寫:
e.g.
var dst = {quux: 0}
var src1 = {foo: 1, bar: 2}
var src2 = {foo: 3, baz: 4}
Object.assign(dst, src1, src2); // dst是要被放值進去的物件, src1和src2陣列的值要放進dst物件裡
console.log(dst); // Object {quux: 0, foo: 3, bar: 2, baz: 4}
p.s. 補充:
從ES5開始, "列舉一個物件中的所有屬性"有3種方法:
1. for...in loops
--> traverses all enumerable properties of an object and its prototype chain. (可知道會列舉出的不只是該物件本身, 連物件原型鏈上的屬性(如果有的話)也會被列舉出來。且for...in loop只會列舉有被列舉出來的屬性, 也就是enumerable: true的那些)
--> 可搭配hasOwnProperty()限定只能列舉出該物件本身的屬性, 而不要列到那些在物件原型鏈上的屬性。
2. Object.keys(物件)
--> returns an array with all the own (not in the prototype chain) enumerable properties names ("keys") of an oject。(只會列舉該物件本身的屬性, 且只會列舉有被列舉出來的屬性, 也就是enumerable: true的那些)
e.g. getFoo這個屬性是不被列舉的屬性:
var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } });
my_obj.foo = 1;
console.log(Object.keys(my_obj)); // console: ['foo']
3. Object.getOwnPropertyNames(物件)
--> returns an array containing all own properties names (enumerable or not) of an object. (只會列舉該物件本身的屬性, 且不管該屬性是否是enumerable: true皆會列舉出來)
p.s. 補充:
Object.assign(target, ...source);
--> 會複製1個至多個來源物件(source objects)中可列舉的屬性到1個目標物件(target object)。會回傳這個目標物件。
--> 要注意來源物件中的值的複製前後順序會影響最後輸出的數值:
e.g.
var o1 = { a: 1, b: 1, c: 1 };
var o2 = { b: 2, c: 2 };
var o3 = { c: 3 };
var obj = Object.assign({}, o1, o2, o3); // 輸出值優先度: o3 > o2 > o1
console.log(obj); // { a: 1, b: 2, c: 3 }
在ES5, 會用Object.keys() & forEach()寫:
e.g.
var dst = {quux: 0};
var src1 = {foo: 1, bar: 2};
var src2 = {foo: 3, baz: 4};
Object.keys(src1).forEach(function(k) {
dst[k] = src1[k]; // 將src1這陣列的值複製到dst物件上
});
Object.keys(src2).forEach(function(k) {
dst[k] = src2[k]; // 將src2這陣列的值複製到dst物件上
});
console.log(dst); // Object {quux: 0, foo: 3, bar: 2, baz: 4}
在ES6可用Object.assign()這個新語法寫:
e.g.
var dst = {quux: 0}
var src1 = {foo: 1, bar: 2}
var src2 = {foo: 3, baz: 4}
Object.assign(dst, src1, src2); // dst是要被放值進去的物件, src1和src2陣列的值要放進dst物件裡
console.log(dst); // Object {quux: 0, foo: 3, bar: 2, baz: 4}
p.s. 補充:
從ES5開始, "列舉一個物件中的所有屬性"有3種方法:
1. for...in loops
--> traverses all enumerable properties of an object and its prototype chain. (可知道會列舉出的不只是該物件本身, 連物件原型鏈上的屬性(如果有的話)也會被列舉出來。且for...in loop只會列舉有被列舉出來的屬性, 也就是enumerable: true的那些)
--> 可搭配hasOwnProperty()限定只能列舉出該物件本身的屬性, 而不要列到那些在物件原型鏈上的屬性。
2. Object.keys(物件)
--> returns an array with all the own (not in the prototype chain) enumerable properties names ("keys") of an oject。(只會列舉該物件本身的屬性, 且只會列舉有被列舉出來的屬性, 也就是enumerable: true的那些)
e.g. getFoo這個屬性是不被列舉的屬性:
var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } });
my_obj.foo = 1;
console.log(Object.keys(my_obj)); // console: ['foo']
3. Object.getOwnPropertyNames(物件)
--> returns an array containing all own properties names (enumerable or not) of an object. (只會列舉該物件本身的屬性, 且不管該屬性是否是enumerable: true皆會列舉出來)
p.s. 補充:
Object.assign(target, ...source);
--> 會複製1個至多個來源物件(source objects)中可列舉的屬性到1個目標物件(target object)。會回傳這個目標物件。
--> 要注意來源物件中的值的複製前後順序會影響最後輸出的數值:
e.g.
var o1 = { a: 1, b: 1, c: 1 };
var o2 = { b: 2, c: 2 };
var o3 = { c: 3 };
var obj = Object.assign({}, o1, o2, o3); // 輸出值優先度: o3 > o2 > o1
console.log(obj); // { a: 1, b: 2, c: 3 }
留言
張貼留言