有時候自幹套件,使用 Object 去設定會非常簡單,但是會有物件繼承問題。要如何快速解決問題呢?我之前有使用過 jQuery.extend
來解決這個問題。但是最近寫 Vue,不太可能使用 Query ,我相信 ES6 應該有新寫法(還真的有),這邊來整理一下。
“jQuery”
1
2
3
4
5
6
7
8
9
10
11
12
13
|
var object1 = {
apple: 0,
banana: { weight: 52, price: 100 },
cherry: 97
};
var object2 = {
banana: { price: 200 },
durian: 100
};
// Merge object2 into object1
$.extend( object1, object2 );
// {"apple":0,"banana":{"weight":52,"price":200},"cherry":97,"durian":100}
|
jQuery.extend的用法-黑暗執行緒
jQuery.extend() | jQuery API Documentation
以下參考: You Might Not Need jQuery
ES6
ECMAScript 6: merging objects via Object.assign()
1
2
|
//Object.assign()
Object.assign(target, source_1, ..., source_n)
|
自幹大法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
var extend = function(out) {
out = out || {};
for (var i = 1; i < arguments.length; i++) {
if (!arguments[i])
continue;
for (var key in arguments[i]) {
if (arguments[i].hasOwnProperty(key))
out[key] = arguments[i][key];
}
}
return out;
};
extend({}, objA, objB);
|
vue 應用
1
2
3
4
|
<input type="number"
:value="settings.autotime"
@change="$emit('update:settings',{ autotime: $event.target.value})"
>秒
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
updateSettings(settings){
console.log('updateSettings', settings)
if(settings.hasOwnProperty('windowAlwaysOnTop')){
if(settings.windowAlwaysOnTop === true){
this.enableWindowAlwaysOnTop()
}else{
this.diseableWindowAlwaysOnTop()
}
}
const {windowAlwaysOnTop} = settings
console.log('windowAlwaysOnTop',windowAlwaysOnTop)
settings.windowAlwaysOnTop = windowAlwaysOnTop
}
},
|
但這樣寫真的太麻煩了,每個屬性都要而外自己判斷,這時候我有想到 extend 類似特性可以用到。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
updateSettings(settings){
console.log('updateSettings', settings)
Object.assign(this.settings,settings)
}
},
watch:{
"settings.windowAlwaysOnTop"(newvalue,oldvalue){
console.log('watch settings.windowAlwaysOnTop',newvalue,oldvalue)
console.log(this)
if(newvalue){
this.enableWindowAlwaysOnTop()
}else{
this.diseableWindowAlwaysOnTop()
}
}
},
|
程式碼可以更精簡設定。
JSON.parse(JSON.stringify(xxxx))
1
|
JSON.parse(JSON.stringify(xxxx))
|