(轉)es6中object.create()和object.assign()

今天學習javascript面向對象,在學習Obejct方法時瞭解到create方法,偶像想起以前使用的assign方法,順帶查找一番,感受這篇博客講解詳細,遂轉載。javascript

先簡單提一下裝飾器函數,許多面向對象的語言都有修飾器(Decorator)函數,用來修改類的行爲。目前,es6中有個提案將這項功能,引入了 ECMAScript。而在ts中則徹底支持裝飾器。這段時間看ng2看獲得我頭大。java

Object.assing(target,…sources)git

參考自微軟的開發者社區。es6

用途:未來自一個或多個源對象中的值複製到一個目標對象。github

語法:Object.assign(target, …sources );ide

參數:   target,  必需。可枚舉屬性複製到的對象。
            …sources, 必需。從其中複製可枚舉屬性的對象。
異常:  若是存在分配錯誤,此函數將引起 TypeError,這將終止複製操做。若是目標屬性不可寫,則將引起 TypeError
備註: null 或 undefined 源被視爲空對象同樣對待,不會對目標對象產生任何影響。

/*合併對象*/函數

例1,
var first = { name: "Bob" };
var last = { lastName: "Smith" };

var person = Object.assign(first, last);
console.log(person);/*{ name: 'Bob', lastName: 'Smith' }*/

/*克隆對象*/
例2,
var obj = { person: "Bob Smith"};
var clone = Object.assign({}, obj);
console.log(obj);/*{ person: 'Bob Smith' }*/

這裏探究備註內容,"nullundefined 源被視爲空對象同樣對待,不會對目標對象產生任何影響。"
var test=null;
var test1=Object.assign({},test);
console.log(test1);/*{}*/

var test2=undefined;
var test4=Object.assign({},test2);
console.log(test4);/*{}*/

經過以上能夠看出,test1和test4依然空對象,印證了備註裏面的內容。學習

 

Object.create(prototype,descriptors)ui

用途:建立一個具備指定原型且可選擇性地包含指定屬性的對象。this

參數:prototype       必需。  要用做原型的對象。  能夠爲 null

          descriptors     可選。  包含一個或多個屬性描述符的 JavaScript 對象。

「數據屬性」是可獲取且可設置值的屬性。  數據屬性描述符包含 value 特性,以及 writableenumerable 和 configurable 特性。  若是未指定最後三個特性,則它們默認爲 false。  只要檢索或設置該值,「訪問器屬性」就會調用用戶提供的函數。  訪問器屬性描述符包含 set 特性和/或 get 特性。

返回值: 一個具備指定的內部原型且包含指定的屬性(若是有)的新對象。
 
異常:   若是知足下列任一條件,則將引起 TypeError 異常:
  • prototype 參數不是對象且不爲 null
  • descriptors 參數中的描述符具備 value 或 writable 特性,並具備 get 或 set 特性。
  • descriptors 參數中的描述符具備不爲函數的 get 或 set 特性。

備註:若要中止原型鏈,能夠使用採用了 null prototype 參數的函數。  所建立的對象將沒有原型。

建立使用null原型的對象並添加兩個可枚舉的屬性。

例1,

var newObj = Object.create(null, {
            size: {
                value: "large",
                enumerable: true
            },
            shape: {
                value: "round",
                enumerable: true
            }
        });

document.write(newObj.size + "<br/>");/*large*/
document.write(newObj.shape + "<br/>");/*round*/
document.write(Object.getPrototypeOf(newObj));/*null*/



建立一個具備與 Object 對象相同的內部原型的對象。 該對象具備與使用對象文本建立的對象相同的原型。 Object.getPrototypeOf 函數可獲取原始對象的原型。 若要獲取對象的屬性描述符,能夠使用Object.getOwnPropertyDescriptor 函數  例2,
var firstLine = { x: undefined, y: undefined };

var secondLine = Object.create(Object.prototype, {
        x: {
                value: undefined, 
                writable: true, 
                configurable: true, 
                enumerable: true
            },
            y: {
                value: undefined, 
                writable: true, 
                configurable: true, 
                enumerable: true
            }
});

document.write("first line prototype = " + Object.getPrototypeOf(firstLine));/*first line prototype = [object Object])*/
document.write("<br/>");
document.write("second line prototype = " + Object.getPrototypeOf(secondLine));/*first line prototype = [object Object]*/


建立一個具備與 Shape 對象相同的內部原型的對象。
例3,
// Create the shape object.
var Shape = { twoDimensional: true, color: undefined, hasLineSegments: undefined };

var Square = Object.create(Object.getPrototypeOf(Shape)); 

要區分數據屬性仍是訪問器屬性。
如下是那數據屬性做爲例子說明,配合訪問器屬性的Object.create()用法暫時還木有搞定。
例4,
var Shape = { twoDimensional: true, color: undefined, hasLineSegments: undefined };

var Square = Object.create(Object.getPrototypeOf(Shape),{xiaoming:{
   value:"hello,world",
   writable:true,

}});
Square.xiaoming="xiaohua";
console.log(Square.xiaoming);/*xiaohua8*/
若是默認writable、enumerable、configurable都是false。原文出處: http://www.onlyfordream.cn/2018/03/19/es6%E4%B8%ADobject-create%E5%92%8Cobject-assign/
相關文章
相關標籤/搜索