今天學習javascript面向對象,在學習Obejct方法時瞭解到create方法,偶像想起以前使用的assign方法,順帶查找一番,感受這篇博客講解詳細,遂轉載。javascript
先簡單提一下裝飾器函數,許多面向對象的語言都有修飾器(Decorator)函數,用來修改類的行爲。目前,es6中有個提案將這項功能,引入了 ECMAScript。而在ts中則徹底支持裝飾器。這段時間看ng2看獲得我頭大。java
Object.assing(target,…sources)git
參考自微軟的開發者社區。es6
用途:未來自一個或多個源對象中的值複製到一個目標對象。github
語法:Object.assign(target, …sources );ide
/*合併對象*/函數
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' }*/
這裏探究備註內容,"null 或 undefined 源被視爲空對象同樣對待,不會對目標對象產生任何影響。"
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 特性,以及 writable、enumerable 和 configurable 特性。 若是未指定最後三個特性,則它們默認爲 false。 只要檢索或設置該值,「訪問器屬性」就會調用用戶提供的函數。 訪問器屬性描述符包含 set 特性和/或 get 特性。
備註:若要中止原型鏈,能夠使用採用了 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/