2017-04-18 51 views
1

爲什麼我不能運行一個ForIn來合併構造函數上的配置?ForIn合併對象配置

我已經得到了這個有很多開放配置的小類,所以我想簡單地運行一個ForIn來縮短代碼。

基本上把這個

var FormMessage = (function() { 

    ... 

    function FormMessage(args) { 
     this.Conf = { 
      mobile:args.mobile || Configurations.mobile, 
      form: { 
       selector: args.form.selector || Configurations.formSelector 
      }, 
      ... 
     } 
    } 
    ... 
    return FormMessage; 
})(); 

var i = new FormMessage({mobile: true, form:{selector: '.the-first'}}), 
    e = new FormMessage({mobile: false, form:{selector: '.the-second'}}); 

這個

var FormMessage = (function() { 
    ... 
    function FormMessage(args) { 
     for (var attr in args) { this.Conf[attr] = args[attr]; } 
    } 
    ... 

    return FormMessage; 
})(); 

var i = new FormMessage({mobile: true, form:{selector: '.the-first'}}), 
    e = new FormMessage({mobile: false, form:{selector: '.the-second'}}); 

但是,如果我這樣做,那麼我第二次初始化對象時,它會覆蓋第一個。

你們知道我該怎麼做這項工作?

感謝您的幫助。

+0

號這是假設是一個單一的對象,每一個屬性是可選的,並且默認的東西,如果沒有通過,而初始化 – Kup

回答

0

也許像下面的代碼一樣?我也認爲IIFE是不必要的。

function FormMessage(conf, args) { 
 
    Object.keys(args).forEach(e => conf[e] = args[e]); 
 
    return Object.assign({}, conf); // returns a fresh new object 
 
} 
 
// initial config object 
 
var confObj = {mobile: 'wow'}; 
 
var i = new FormMessage(confObj, {mobile: true, form:{selector: '.the-first'}}), 
 
    e = new FormMessage(confObj, {mobile: false, form:{selector: '.the-second'}}); 
 

 
console.log(i, e);