New 和 Object.create()的區別
阿新 • • 發佈:2019-01-30
前言
我們在建立物件的時候,通常使用的就是new例項化物件,但現在javascript的標準裡面提出了新的方案:Object.create(),詳情詳細的介紹可以點選檢視MDN。下面就簡單介紹一下兩者的區別。
New
new是js中的操作符,可以建立一個使用者定義的物件型別的例項或具有建構函式的內建物件的例項。
語法: new constructor ( [aguments] )
由此我們可以看出,實際new建立物件,就是呼叫建構函式來例項化,在呼叫建構函式的時候會執行以下操作:
- 建立一個新的物件
- 將新物件執行原型操作,指向建構函式的原型
- 將this繫結到新物件上(可以使用call強制轉換執行環境)
- 建構函式返回的物件就是例項化的結果,如果建構函式沒有顯示返回一個物件,則返回新的物件
Object.create()
Object.create()是Object的內建方法,可以建立一個新物件,使用現有的物件來提供新建立的物件__proto__
語法:Object.create ( proto, [ propertiesObject ] )
該方法有兩個引數,第一個proto是一個物件,作為新建物件的原型;第二個引數是一個物件,該物件的屬性名稱是新建立的物件的屬性名稱。使用該方法,建立物件會執行以下步驟:
- 方法內部定義一個新的空物件obj
- 將obj.__proto__的物件指向傳入的引數proto
- 返回一個新的物件
區別
比較 | new | Object.create |
---|---|---|
建構函式 | 保留原建構函式屬性 | 丟失原建構函式屬性 |
原型鏈 | 原建構函式prototype屬性 | 原建構函式/(物件)本身 |
作用物件 | function | function和object |
如果使用function來構建,則使用new和Object.create()構建的物件又有什麼區別呢?詳見如下示例:
由上面的例子可以看出,new生成的物件的__proto__指向建構函式的原型物件,而使用create生成的物件的__proto__則指向傳入的引數Function。
下面的示例是通過原型鏈來模擬實現Object.create()的方法: