2015-07-12 36 views
1

我是一個JavaScript新手,有一個讓我困惑的問題。如何理解Object.hasOwnProperty(「構造函數」)

Object.constructor是一個函數,但Object.hasOwnProperty("constructor") == false。爲什麼?

正如我們所知,Object的prev爲空,也許是Object.prototype.__proto__ == null。如何添加對象的「構造函數」的屬性?

+1

「對象」是一個函數。當執行'f = function(){}'時,函數本身沒有屬性'構造函數'。至少在Chrome中,Function .__ proto__返回Empty,而Empty具有'構造函數'屬性(這解釋了hasOwnProperty的差異)。我不確定這是如何編寫在ECMAScript規範。 – user2864740

回答

2

Object.constructor不是功能; Object.prototype.constructorObject本身是一個構造函數。從MDN

在非構造函數上下文中調用時,Object的行爲與新Object()的行爲相同。

看看,試試:

Object.hasOwnProperty("constructor") == false 
Object.prototype.hasOwnProperty("constructor") == true 
typeof Object == "function" 
typeof (new Object) == "object" 
+1

'typeof Object.constructor ===「function」; // true' – 2015-07-12 02:14:52

+0

引用說'Object()'(即「..when * called * ..」)相當於'new Object()'。但是在問題中不會調用稱爲Object的*函數*;有或沒有新的。 – user2864740

1

當調用Object.hasOwnProperty( 「構造」),正在測試,看看該屬性的構造函數「是否對對象存在。也就是說,您不會查找__proto__鏈來查看鏈中是否存在該屬性。對於Object而言,'constructor'屬性在Object上不存在,它是一個繼承的屬性 - >看看Object .__ proto __。constructor和Object .__ proto __。hasOwnProperty('constructor')

注意:Object .__ proto__ === Function.prototype的// =>從Here

採取正如我們看到的對象不具有它自己的財產「構造」,所以每當我們做b.constructor真正

0

http://dmitrysoshnikov.com/ecmascript/javascript-the-core/

圖片,它轉到它的原型並在原型中查找構造函數屬性。但b.hasOwnProperty('構造函數')會失敗,但b.prototype.hasOwnProperty('構造函數')將返回true。