Object.prototype.toString.call(something)
上面這段代碼通常被用來判斷變量的類型,相信不少人都很是熟悉
今天coding時用到上面這段代碼,忽然想到 Object.toString
方法,爲啥二者不同呢Object
的 toString
並非自有屬性,而是繼承屬性
那 Object
究竟時繼承的誰呢,或者換句話說,Object
時由什麼構造的呢?ui
Object.toString.call([])
爲啥運行上面這段代碼會提示 Function.prototype.toString requires that 'this' be a Function
this
console.log(Object.__proto__.constructor) // ƒ Function() { [native code] } Object.toString === Function.prototype.toString // true Object.__proto__ === Function.prototype // true Object instanceof Function // true
原來執行 Object.toString.call([])
等同於執行 Function.prototype.toString([])
並且 Object
是由 Function
構造的
那麼 Function
又是由什麼構造的呢prototype
console.log(Function.__proto__.constructor) // ƒ Function() { [native code] }
咱們看到 Function
是由 Function
構造的
那麼是否是說 Function
就是繼承鏈的最頂層了呢? 答案確定是 不是code
Function.prototype.__proto__ === Object.prototype // true Function.__proto__.__proto__ === Object.prototype // true Object.__proto__.__proto__ === Object.prototype // true Function.prototype.constructor === Object // false
咱們看到, Function.prototype
的 _proto__
指向了 Object.prototype
咱們以前說過, Function
繼承自 Function
,天然 Function.__proto__.__proto__
是指向 Object.prototype
的
咱們以前也說過, Object
繼承自 Function
,因此Object.__proto__.__proto__
也是指向 Object.prototype
的繼承