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
的继承