1. 程式人生 > >一道筆試題引發的對Object.creat()的思考

一道筆試題引發的對Object.creat()的思考

是否 理解 成了 使用 style 控制 現在 __proto__ alt

今天晚上參加了酷家樂的筆試,有一道選擇題讓我有點猶豫,現在放出來讓大家先思考一下。

(憑記憶敲出來的代碼,有錯望雅正)

技術分享圖片

憑上面的這段代碼,我們可能首先會想 a 和 b 是不是引用同一個對象,從Object.create( )這個方法來講,它應該是創建一個新的對象,所以不應該是引用同一個對象,那麽排除引用同一個對象的可能。那有沒有可能是對象的復制呢,如果我們把這個過程看做是對象的復制,那麽控制臺的輸出結果應該是: 1,3

我們現在公布控制臺的輸出結果:

技術分享圖片

結果是不是跟我們預料的有點不太一樣,我們先去MDN看一下它是怎麽解釋Object.create( )的。

下面是來自MDN官方的解釋:

Object.create()方法創建一個新對象,使用現有的對象來提供新創建的對象的__proto__。

所以根據結合官方文檔的解釋題目我們可以理解成這個創建的新對象 b 它的原型指向了 a,一開始打印的 b.foo 並不是 b 自己的 foo 屬性,而是 a 的 foo 屬性,要證明這一點非常容易,我們可以使用hasOwnProperty方法去檢測 foo 是否是 b 自身的屬性。

下面是實例代碼

技術分享圖片

控制臺輸出結果:

技術分享圖片

結果顯示很明顯了,也證明一開始打印的並不是 b 自身的 foo 屬性,而是 a 的 foo 屬性,後面 b.foo = 3; b才擁有自己的 foo 屬性,所以打印出來是3。

  關於Object.create( )方法,它的用法不止於此,它可以用來實現Java的那種繼承的思想(通過原型鏈的方式),當我們通過new去創建一個對象的時候也會發生同樣的現象,也就是新new的這個對象的原型會指向構造這個對象的函數的prototype屬性,而prototype屬性本身就是一個對象,這中間的指向其實就構成了一個原型鏈,我們在調用一個對象的屬性或方法的時候,會先從它的自身屬性開始找,找不到就沿原型鏈向上查找。所以當我們用字面量 var a = { };創建一個“空”對象時,我們也可以把它等價於var a = Object.create(Object.prototype);

註解:這裏的“空”打了雙引號是想說明 a 實際並不是一個空的對象,它只是沒有自身的屬性,但是它能調用Object.prototype定義的方法,而Object.create( null )則是個完全空的對象,它並不能調用Object.prototype定義的方法,因為它創建的對象原型指向了null,所以想要創建一個“空”的對象就要記得不要用Object.create( null )啦。

一道筆試題引發的對Object.creat()的思考