程式狂想筆記

一個攻城師奮鬥史

0%

JavaScript Object 繼承物件屬性大法

有時候自幹套件,使用 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))