[英]setting javascript object properties from constructor default values using parameter destructuring
關於ES6解構這個javascript對象構造函數中的默認用法,這是一個棘手的問題。
我想收到一個具有我的對象構造函數的默認值的destructured參數對象
所以我做的就是這個
function bla({a=3,b=6}={}){
this.a=a;
this.b=b;
console.log(`this.a::'${this.a}' this.b::'${this.b}' a::'${a}' b::'${b}'`);
}
let myObject= new bla({a:1});
console.log(`myObject.a::'${myObject.a}' myObject.b::'${myObject.b}'`); // only a got overriden with value "1" and b remained its defauly value "6"
我知道我做了什么。 但是,您可以看到這有點代碼味道,因為每次我需要向構造函數添加新參數(例如{newParameter = 3})時,我還需要向下添加一個匹配的行,如下所示在構造函數體中
this.newParameter=newParameter;
有沒有更優雅的方法來添加一個自動附加到“this”的默認值的析構參數。
我個人認為你目前的方法是最具可讀性的,但你在技術上也可以做到
function bla(obj = {}){
({
a: this.a = 3,
b: this.b = 6,
} = obj);
console.log(`this.a::'${this.a}' this.b::'${this.b}'`);
}
我遵循更多的功能樣式,以避免new
的對象創建和this
關鍵字。
您可以簡單地編寫一個返回object
的函數,並使用默認值獲取多個參數。
感謝對象文字屬性值的簡寫,你可以少寫。
function returnObject(a = 1, b = 2, c = 3) { return { a, b, c } } console.log(returnObject())
不知道這是否最好,但您可以使用Object.assign
。
function bla(props={}) { Object.assign(this, {a:3,b:6}, props); console.log(`this.a::'${this.a}' this.b::'${this.b}'`); } let myObject= new bla({a:1}); console.log(`myObject.a::'${myObject.a}' myObject.b::'${myObject.b}'`); // only a got overriden with value "1" and b remained its defauly value "6"
您丟失了參數名稱,但可以認為這樣做更好,以便在您想要改變對象屬性時不會意外地改變參數。
如果目標是使用變量名稱一次,那么這就是我要做的:
const foo = new Foo({ a: 1 }); console.log(`foo { a: ${foo.a}, b: ${foo.b} }`); function Foo(config = {}) { const defaults = { a: 3, b: 6 }; for (const [key, val] of Object.entries(defaults)) ({ [key]: this[key] = val } = config); }
現在,您只需要更新defaults
對象即可。
實際上,讓我們通過抽象這個模式來構造一個構造函數構造函數:
const Foo = defcons({ a: 3, b: 6 }); const foo = new Foo({ a: 1 }); console.log(`foo { a: ${foo.a}, b: ${foo.b} }`); function defcons(defaults) { return function (config = {}) { for (const [key, val] of Object.entries(defaults)) ({ [key]: this[key] = val } = config); }; }
現在,您可以輕松地創建任意數量的構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.