Contents

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))