Object.create() 詳解
01 分 析
語(yǔ)法:
Object.create(proto[,propertiesObject])
參數(shù)
????????proto
????????創(chuàng)建對(duì)象的原型,表示要繼承的對(duì)象
????????
????????
????????propertiesObject(可選 )
????????也是一個(gè)對(duì)象,用于對(duì)新創(chuàng)建的對(duì)象進(jìn)行初始化
????????
?????????
????????
????????注:Object.create(null) 創(chuàng)建的對(duì)象是一個(gè)空對(duì)象,在該對(duì)象上沒(méi)有繼承 Object.prototype 原型鏈上的屬性或者方法
如圖:

我們來(lái)看看底層實(shí)現(xiàn)
F.prototype屬性,進(jìn)行了重新賦值,且指向傳遞的參數(shù)o;
?
02 應(yīng) 用
示例代碼:
能想到MyObj 的輸出結(jié)果是什么嘛?會(huì)有哪些屬性?(先思考一下 )
看看運(yùn)行結(jié)果,是否和你想的一樣呢??

你會(huì)發(fā)現(xiàn),第一個(gè)參數(shù),在返回對(duì)象的原型上,而不是直接屬性,可再回顧一下Object.create實(shí)現(xiàn)的底層原理;
第二參數(shù),則是對(duì)返回對(duì)象添加屬性,且進(jìn)行屬性描述對(duì)象的設(shè)置,關(guān)于屬性描述對(duì)象,請(qǐng)看下面介紹?
03 Object 對(duì)象 — 屬性描述對(duì)象
JavaScript 提供了一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來(lái)描述對(duì)象的屬性,控制它的行為,比如該屬性是否可寫、可遍歷等等。這個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)稱為“屬性描述對(duì)象”(attributes object)。每個(gè)屬性都有自己對(duì)應(yīng)的屬性描述對(duì)象,保存該屬性的一些元信息。
下面是屬性描述對(duì)象的一個(gè)例子。
屬性描述對(duì)象提供6個(gè)元屬性。
(1)value
value是該屬性的屬性值,默認(rèn)為undefined。
(2)writable
writable是一個(gè)布爾值,表示屬性值(value)是否可改變(即是否可寫),默認(rèn)為true。
(3)enumerable
enumerable是一個(gè)布爾值,表示該屬性是否可遍歷,默認(rèn)為true。如果設(shè)為false,會(huì)使得某些操作(比如for...in循環(huán)、Object.keys())跳過(guò)該屬性。
(4)configurable
configurable是一個(gè)布爾值,表示可配置性,默認(rèn)為true。如果設(shè)為false,將阻止某些操作改寫該屬性,比如無(wú)法刪除該屬性,也不得改變?cè)搶傩缘膶傩悦枋鰧?duì)象(value屬性除外)。也就是說(shuō),configurable屬性控制了屬性描述對(duì)象的可寫性。
(5)get
get是一個(gè)函數(shù),表示該屬性的取值函數(shù)(getter),默認(rèn)為undefined。
(6)set
set是一個(gè)函數(shù),表示該屬性的存值函數(shù)(setter),默認(rèn)為undefined。
?
04 Object.create繼承的應(yīng)用
劃重點(diǎn):相對(duì)于構(gòu)造函數(shù)的繼承Object.create繼承實(shí)現(xiàn)了將A,B的原型完美分隔 。雙方不會(huì)互相影響。這是Object.create亮點(diǎn)所在
?
相關(guān)面試題:
對(duì)象字面量創(chuàng)建對(duì)象與 Object.create(null)創(chuàng)建對(duì)象有什么區(qū)別
答案:http://bugshouji.com/miansiti/t1406
更多內(nèi)容,請(qǐng)關(guān)注公主號(hào):bug收集? 作者:doubleyong