如果您使用say var obj = {};
創建常規javascript對象,它將具有對象原型。使用var obj = new MyClass();
創建的對象也是如此。在引入Object.create
之前,沒有辦法解決這個問題。但是現在可以使用var obj = Object.create(null);
創建一個沒有原型的對象(分別爲null
作爲其原型)。Object.create(null)的用例?
爲什麼這很重要?它帶來了什麼好處?有沒有真實世界的用例?
如果您使用say var obj = {};
創建常規javascript對象,它將具有對象原型。使用var obj = new MyClass();
創建的對象也是如此。在引入Object.create
之前,沒有辦法解決這個問題。但是現在可以使用var obj = Object.create(null);
創建一個沒有原型的對象(分別爲null
作爲其原型)。Object.create(null)的用例?
爲什麼這很重要?它帶來了什麼好處?有沒有真實世界的用例?
它是一個完全空的對象(沒有任何東西從.prototype
包含Object.prototype
繼承),所以你可以保證任何屬性查找只有在屬性被明確地添加到對象時纔會成功。
例如,如果您想要預先存儲一些您不知道密鑰的數據,則提供的密鑰有可能與Object.prototype
的成員具有相同的名稱,並導致錯誤。
在這些情況下,您需要執行明確的.hasOwnProperty()
檢查以排除意外的繼承值。但是,如果沒有任何遺傳,您的測試可以簡化爲if (key in my_object) {
測試,或者如果合適,也可以簡單測試if (my_object[key]) {
。
此外,沒有原型鏈,我會想象,結果不存在的屬性查找會更快,因爲只需要檢查直接對象。性能測試可以確定是否實際出現(由於優化)。
創建一個對象與{}
和Object.create(null)
之間唯一的區別是對象原型不會被繼承。
這意味着我們通常假定我們可以調用任何對象的任何方法都不會存在,例如toString
和valueOf
。這些名單可以在這裏找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype
從性能角度看,僅僅通過{}
創建一個對象實際上是要快得多,所以,除非你特別不能有下的對象的原型,你不應該以這種方式創建對象的功能。
一樣:http://www.devthought.com/2012/01/18/an-object-is-not-a-hash/爲了確保沒有衝突與繼承屬性。 – Aravind