譯者按: 這篇博客將介紹ES6新增的Object.assign()方法。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到白朗網(wǎng)站設(shè)計(jì)與白朗網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋白朗地區(qū)。為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。
將A對(duì)象的屬性復(fù)制給B對(duì)象,這是JavaScript編程中很常見(jiàn)的操作。這篇博客將介紹ES6的Object.assign()屬性,可以用于對(duì)象復(fù)制。
在JavaScript生態(tài)系統(tǒng)中,對(duì)象復(fù)制有另外一個(gè)術(shù)語(yǔ): extend。下面是兩個(gè)JS庫(kù)提供的extend接口:
ES6提供了Object.assign(),用于合并/復(fù)制對(duì)象的屬性。
Object.assign(target, source_1, ..., source_n)
它會(huì)修改target對(duì)象,然后將它返回:先將source_1對(duì)象的所有可枚舉屬性復(fù)制給target,然后依次復(fù)制source_1等的屬性。
在ES6中,對(duì)象的屬性名可以是字符串或者Symbol。因?yàn)镾ymbol值具有唯一性,這就意味著Symbol作為對(duì)象的屬性名時(shí),可以保證不會(huì)出現(xiàn)同名的屬性。對(duì)象屬性名為字符串或者Symbol時(shí),Object.assign()都支持。
target對(duì)象的屬性是通過(guò)復(fù)制來(lái)創(chuàng)建的,這就意味著,如果target有setters方法時(shí),它們將會(huì)被調(diào)用。
另一種方案是通過(guò)定義來(lái)實(shí)現(xiàn),這樣將會(huì)創(chuàng)建新的自有屬性,不會(huì)調(diào)用setters方法。其實(shí),另一個(gè)版本的Object.assign()的提案正是采用這種方法。不過(guò),這個(gè)提議在ES6中被拒絕了,也許之后的版本會(huì)再考慮。
構(gòu)造器正是為了初始化對(duì)象的屬性,通常,我們不得不多次重復(fù)屬性的名字。示例代碼的constructor中,x與y均重復(fù)了兩次:
class Point
{
constructor(x, y)
{
this.x = x;
this.y = y;
}
}
如果可以的話,個(gè)人偏愛(ài)將所有冗余都省去。(事實(shí)上,CoffeeScript與TypeScript都有語(yǔ)法解決構(gòu)造器中屬性名重復(fù)的問(wèn)題。):
class Point
{
constructor(this.x, this.y){}
}
至少,Object.assign()可以幫助我們減少一些重復(fù):
class Point
{
constructor(x, y)
{
Object.assign(this, { x, y });
}
}
在ES6中, { x, y }
為{ x: x, y: y }
的縮寫(xiě)。
ECMAScript 5, you use a function expression to add a method to an object:
在ES5中,需要使用function關(guān)鍵字定義對(duì)象的新增方法:
MyClass.prototype.foo = function(arg1, arg2)
{
//...
};
在ES6中,對(duì)象方法的定義更加簡(jiǎn)潔,不需要使用function關(guān)鍵字。這時(shí),可以使用Object.assign()為對(duì)象新增方法:
Object.assign(MyClass.prototype,
{
foo(arg1, arg2)
{
//...
}
});
使用Object.assign()深度復(fù)制對(duì)象,包括其prototype
var Point = function(x)
{
this.x = x;
}
Point.prototype.y = 2;
var obj = new Point(1);
var copy = Object.assign({ __proto__: obj.__proto__ }, obj); // 輸出{x:1,y:2}
console.log(copy) // 輸出{x:1,y:2}
僅復(fù)制自身屬性:
var Point = function(x)
{
this.x = x;
}
Point.prototype.y = 2;
var obj = new Point(1);
var copy = Object.assign({}, obj);
console.log(copy) // 輸出{x:1}
Fundebug專(zhuān)注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實(shí)時(shí)BUG監(jiān)控。 自從2016年雙十一正式上線,F(xiàn)undebug累計(jì)處理了7億+錯(cuò)誤事件,得到了Google、360、金山軟件、百姓網(wǎng)等眾多知名用戶的認(rèn)可。歡迎免費(fèi)試用!
轉(zhuǎn)載時(shí)請(qǐng)注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/09/11/object-assign/
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。