天天看點

JavaScript:Object.create()與new Object()的差別

作者:earllynn

#頭條創作挑戰賽#

JavaScript:Object.create()與new Object()的差別

前端小白Earl筆記

new Object()

new建立一個使用者定義的對象類型的執行個體或具有構造函數的内置對象的執行個體。new Object()通過構造函數建立對象,或者連結該對象(即設定該對象的構造函數)到另一個對象。new Object()與javascript對象字面量建立的形式{}有許多相同之處:建立一個對象,添加的屬性是在自身執行個體下;新建立對象的原型繼承了Object 原型鍊上(Object.prototype)……

Object.create()

Object.create()用于建立一個新對象,使用現有的對象來作為新建立對象的原型(prototype)。

Object.create(proto,propertiesObject)

參數proto是必須的,是新建立對象的原型對象,即傳入的該參數會被指派到新建立對象的原型(prototype);該參數可以為null或者除基本類型包裝對象以外的對象。

第二個參數propertiesObject則是可選的。傳入的該參數的自有可枚舉屬性(其自身定義的屬性,而不是其原型鍊上的枚舉屬性)将為新建立對象添加指定的屬性值和對應的屬性描述符。

Object.create()與new Object()的差別

從以上介紹可以看出,Object.create()與new Object()第一個差別就是所建立對象繼承的原型不同:new Object()的原型繼承内置對象Object;而Object.create()的原型則是繼承指定對象,新建立對象本身并沒有直接繼承Object.prototype 的屬性和方法。當Object.create()的必傳參數proto為null時,則會建立以null為原型的對象,沒有繼承Object.prototype 的任何對象方法。

而由于Object.create()與new Object()建立對象的方式不同,添加的屬性也就有所不同:

new Object() 通過構造函數來建立對象,添加的屬性是在自身執行個體下;Object.create()則可以了解為繼承對象,添加的屬性是在原型下,如果沒有傳入可選參數propertiesObject則建立空對象{}。而如果要在所建立的對象中添加屬性,則需要傳入參數propertiesObject,即Object.create(proto,propertiesObject)。需要注意的是,由參數propertiesObject傳入的屬性,屬性特性預設為false,在未聲明屬性特性的情況下,該屬性是不可寫,不可枚舉,不可配置的。

var a = {x:1}                      // {x:1}

var b = new Object({x:1})          // {x:1}

b.x                                // 1

var c = Object.create({x:1})       // { }

c.__proto__                        // {x:1}

c.x                                // 1  
           
JavaScript:Object.create()與new Object()的差別
JavaScript:Object.create()與new Object()的差別
JavaScript:Object.create()與new Object()的差別

繼續閱讀