方法說明javascript
Object.create()
方法建立一個新的對象,並以方法的第一個參數做爲新對象的__proto__
屬性的值(以第一個參數做爲新對象的構造函數的原型對象)Object.create()
方法還有第二個可選參數,是一個對象,對象的每一個屬性都會做爲新對象的自身屬性,對象的屬性值以descriptor(Object.getOwnPropertyDescriptor(obj, 'key'))
的形式出現,且enumerable
默認爲false
源碼點撥java
搞清楚上面的方法描述說的意思,而後實現的時候實際上是比較簡單的,就是定義一個空的構造函數,而後指定構造函數的原型對象,經過
new
運算符建立一個空對象,若是發現傳遞了第二個參數,經過Object.defineProperties爲建立的對象設置key、value,最後返回建立的對象便可
源碼函數
Object.myCreate = function (proto, propertyObject = undefined) { if (propertyObject === null) { // 這裏沒有判斷propertyObject是不是原始包裝對象 throw 'TypeError' } else { function Fn () {} Fn.prototype = proto const obj = new Fn() if (propertyObject !== undefined) { Object.defineProperties(obj, propertyObject) } if (proto === null) { // 建立一個沒有原型對象的對象,Object.create(null) obj.__proto__ = null } return obj } } // 示例 // 第二個參數爲null時,拋出TypeError // const throwErr = Object.myCreate({a: 'aa'}, null) // Uncaught TypeError // 構建一個以 const obj1 = Object.myCreate({a: 'aa'}) console.log(obj1) // {}, obj1的構造函數的原型對象是{a: 'aa'} const obj2 = Object.myCreate({a: 'aa'}, { b: { value: 'bb', enumerable: true } }) console.log(obj2) // {b: 'bb'}, obj2的構造函數的原型對象是{a: 'aa'}