天天看點

Object.create() 和 new Object()

object.create(proto, propertiesobject)

<code>object.create()</code> 是使用指定的原型<code>proto</code>對象及其屬性<code>propertiesobject</code>去建立一個新的對象。(mdn)

<code>proto</code> 是必填參數,就是新建立出來的對象的原型 (新對象的 <code>__proto__</code>屬性指向的對象),值得注意的是當<code>proto</code>為<code>null</code>的時候建立的新對象完全是一個空對象,沒有原型(圖一),也就是沒有繼承<code>object.prototype</code>上的方法。(如<code>hasownproperty()</code> <code>tostring()</code> 等)

Object.create() 和 new Object()

圖1

<code>propertiesobject</code>是可選參數,作用就是給新對象添加新屬性以及描述器(圖2),具體可參考 object.defineproperties() - mdn 的第二個參數。需要注意的是新添加的屬性是新對象自身具有的屬性也就是通過<code>hasownproperty()</code> 方法可以擷取到的屬性,而不是添加在原型對象裡。(圖3)

Object.create() 和 new Object()

圖2

Object.create() 和 new Object()

圖3

具體三個步驟就是:

建立一個對象

繼承指定父對象

為新對象擴充新屬性

自己實作一個<code>object.create()</code> :

new object()

<code>new</code> 運算符是建立一個自定義對象或者具有構造函數的内置對象的執行個體mdn

使用<code>new</code>運算符會建立一個新的對象,它繼承自構造函數的<code>prototype</code>,也就是說它的<code>__proto__</code>屬性會指向構造函數的<code>prototype</code>

<code>new object()</code> 也就是具有構造函數的内置object的執行個體,新建立的對象的<code>__proto__</code>屬性會指向object的<code>prototype</code>

擴充:執行個體複現new的構造過程:

總結差別

<code>object.cerate()</code> 必須接收一個對象參數,建立的新對象的原型指向接收的參數對象,new object() 建立的新對象的原型指向的是 object.prototype. (表述有點啰嗦,簡潔點說就是前者繼承指定對象, 後者繼承内置對象object)

可以通過<code>object.create(null)</code> 建立一個幹淨的對象,也就是沒有原型,而 <code>new object()</code> 建立的對象是 object的執行個體,原型永遠指向<code>object.prototype</code>.

繼續閱讀