譯者按: 這篇博客將介紹ES6新增的Object.assign()方法。javascript
爲了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原做者全部,翻譯僅用於學習。html
將A對象的屬性複製給B對象,這是JavaScript編程中很常見的操做。這篇博客將介紹ES6的Object.assign()屬性,能夠用於對象複製。java
在JavaScript生態系統中,對象複製有另一個術語: extend。下面是兩個JS庫提供的extend接口:es6
ES6提供了Object.assign(),用於合併/複製對象的屬性。express
Object.assign(target, source_1, ..., source_n)
它會修改target對象,而後將它返回:先將source_1對象的全部可枚舉屬性複製給target,而後依次複製source_1等的屬性。編程
在ES6中,對象的屬性名能夠是字符串或者Symbol。由於Symbol值具備惟一性,這就意味着Symbol做爲對象的屬性名時,能夠保證不會出現同名的屬性。對象屬性名爲字符串或者Symbol時,Object.assign()都支持。小程序
target對象的屬性是經過複製來建立的,這就意味着,若是target有setters方法時,它們將會被調用。微信小程序
另外一種方案是經過定義來實現,這樣將會建立新的自有屬性,不會調用setters方法。其實,另外一個版本的Object.assign()的提案正是採用這種方法。不過,這個提議在ES6中被拒絕了,也許以後的版本會再考慮。微信
構造器正是爲了初始化對象的屬性,一般,咱們不得很少次重複屬性的名字。示例代碼的constructor中,x與y均重複了兩次:學習
class Point { constructor(x, y) { this.x = x; this.y = y; } }
若是能夠的話,我的偏心將全部冗餘都省去。(事實上,CoffeeScript與TypeScript都有語法解決構造器中屬性名重複的問題。):
class Point { constructor(this.x, this.y){} }
至少,Object.assign()能夠幫助咱們減小一些重複:
class Point { constructor(x, y) { Object.assign(this, { x, y }); } }
在ES6中, { x, y }
爲{ x: x, y: y }
的縮寫。
ECMAScript 5, you use a function expression to add a method to an object:
在ES5中,須要使用function關鍵字定義對象的新增方法:
MyClass.prototype.foo = function(arg1, arg2) { //... };
在ES6中,對象方法的定義更加簡潔,不須要使用function關鍵字。這時,可使用Object.assign()爲對象新增方法:
Object.assign(MyClass.prototype, { foo(arg1, arg2) { //... } });
使用Object.assign()深度複製對象,包括其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}
僅複製自身屬性:
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專一於JavaScript、微信小程序、微信小遊戲、支付寶小程序、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了7億+錯誤事件,獲得了Google、360、金山軟件、百姓網等衆多知名用戶的承認。歡迎免費試用!
轉載時請註明做者Fundebug以及本文地址:
https://blog.fundebug.com/2017/09/11/object-assign/