2016-09-29 64 views
3

我的方法的參數之一應該是一個對象。 像往常一樣,我可以在原型中指定它的默認值。使默認值適用於對象參數的單個字段

但是這個默認值只用於在通話中完全省略這個參數。

然而,我想爲它在現場級應用:如果我提供一個值,但省略某些領域中存在的默認,就應該從它填補:未指定

function method(id, data, options = { original: true, duplicate: true }) { 
    console.log(options.original); 
    console.log(options.duplicate); 
} 

method("id", "data", { duplicate: false }) 
// undefined <= I expect this to be true 
// false 

method("id", "data") 
// true 
// true 

任何參數在默認情況下也應該被接受和傳遞的是:

method("id", "data", { duplicate: false, other: false }) 

如果有任何句法設施,我可以使用是什麼?而且,即使沒有,我也必須使用自定義邏輯,我可以以某種方式從原型中提取默認值嗎?

ES6 Object Destructuring Default Parameters實現了類似的東西,但它將「字段」轉換爲單獨的變量(雖然我希望它們留在對象內),並且它不允許原型中未指定的字段。

+0

De罰款「我希望它能夠通過其他選項,不僅是我所定義的」。他們應該如何表現? –

+0

在我上面的方法函數中,我可以爲選項添加另一個屬性,例如:'other:false'。但所有的答案都沒有解決這個問題。 – shankshera

+0

@ivan_pozdeev這是一個相當大的編輯。你確定它遵循OP的意圖嗎?提出一個新問題可能會更好。 – Bergi

回答

0

默認參數值僅在變量級上,而不是屬性。
你最好不要做這樣的事情(僞代碼):
extend({ original: true, duplicate: true }, options)

編輯
它實際上可以用解構是可能的,試試這個:
function method(id, data, {original = true, duplicate = true} = {}) {}

+1

你的意思是「可能」是什麼意思?它之前把它放在答案? – nnnnnn

+1

否:(沒有時間,我是一個壞人? –

+1

你*可能*是... – nnnnnn

1

您可以使用默認賦值爲destructuring assignment表示法:

function method(id, data, {original, duplicate} = { original: true, duplicate: true }) { 
    console.log(original); 
    console.log(duplicate); 
} 
+0

這正是OP想要避免的行爲 – Bergi

+0

你怎麼知道如果我只使用其中一個定義的選項調用方法,其他選項將不會得到它的默認值*「。您的答案使用解構,但是他想要避免它?也許他沒有閱讀其他答案 –

+0

」仍然有這個問題。 – Bergi