大概會用一個系列,講一下面試過程當中常常會問的一些問題,以及我以爲應該能夠怎麼回答。面試
固然,個人回答也並非標準答案,只是我本身的一些理解,也歡迎其餘人發表本身的想法。函數
做爲本系列的第一篇文章,就先講講被問的最多的 js 繼承
問題,可是應該不會寫原型鏈相關的東西,測試
先列舉一個最簡單的問題:es5
寫一個inherit(superClass, subClass)
方法,實現subClass
繼承superClass
繼承有哪些特徵,如何檢測一個繼承是否成功?
foo instanceof superClass
測試function inherit(p, s) { s.prototype = Object.create(p.prototype, { constructor: { value: s, enumerable: false, writebale: true, configurable: true } }) Object.setPrototypeOf ? Object.setPrototypeOf(s, p) : s.__proto__ = p }
function inherit(p, s) { var f = new Function () f.prototype = new p() var r = new f() s.prototype = r s.prototype.constructor = s s.__proto__ = p f = null r = null }
Object.create
是什麼?怎麼使用?Object.create(proto, [propertiesObject])
Object.create
提供了一個建立對象的方法,使用現有的對象做爲新建立對象的__proto__
,同時能夠傳入添加到新對象的可枚舉屬性, 這些屬性能夠對應到Object.defineProperties
的第二個參數中。prototype
返回值爲所建立的新對象.code
例如:對象
s.prototype = Object.create(f.prototype, { constructor: { value: s, enumberable: false, writealble: true, configurale: true } })
Object.defineProperties
是什麼?怎麼使用?能夠列舉一個 Object.definProperties
的實際應用嗎?Object.defineProperties
能夠直接在一個對象上定義或修改屬性,並返回該對象。繼承
例如:ip
target = Object.defineProperties(target, props)
本質上 Object.defineProperties
是對Object.defineProperty
的集中調用,能夠理解爲是Object.definePeropety
的複數版。原型鏈
Object.defineProperty
的使用方法爲:
target = Object.defineProperty(target, prop, descriptor)
因此本質上Object.defineProperties
就是以下代碼:
Object.keys(props).forEach(function (prop) { let descriptor = props[prop] Object.defineProperty(target, prop, descriptor) })
其中 descriptor
的可選值有如下集中:
true
時,該屬性描述符纔可以被改變,同時該屬性也能從對應的對象上被刪除。默認爲 false
。true
時,該屬性纔可以出如今對象的枚舉屬性中。默認爲 false
。undefined
undefined
。undefined
。若是一個 descriptor 不具備 value
, writebale
, get
和 set
任意一個關鍵字,那麼將會被認爲是一個數據描述符。
若是一個描述符同時具備(value
或writbale
)和(get
或set
),將會產生一個異常.
繼承多個父類的話,可使用 Object.assign
方法。
例如:
targe = Object.assign({}, superClassA, superClassB, ...)
可是繼承多個父類的話,子類就不能經過 son instanceof superClass
這樣的驗證了.
Object.assign
是什麼?怎麼用?用的時候有哪些須要注意?Object.assign
方法用於將全部可枚舉屬性從一個或多個源對象複製到目標對象,並返回目標對象,例如:
target = Object.assign(target, source)
若是具備同名屬性,那麼在後面對象中的屬性,將會覆蓋目標對象中的屬性。
須要注意如下幾點:
null
, undefined
會被忽略,而且只有字符串的包裝對象纔可能有自身可枚舉的屬性.symbol
類型的屬性Object.assign
會調用 setter
和 getter
嗎?調用的是哪裏的setter
和getter
?Object.assign
會調用源對象的 getter
,並把源對象的 getter
的返回值當作新對象的該屬性的值。setter
則是會直接加在新建立的對象中,而不會沿用源對象的 setter
.
Object.getOwnPropertyDescriptor
是什麼?主要用來作什麼?Object.getOwnPropertyDescriptor
返回直到對象上一個自有屬性對應的描述符,例如:
Object.getOwnPropertyDescriptor(obj, prop)