Object.prototype.toString.call(something)
上面这段代码一般被用来判断变量的类型,相信很多人都非常熟悉
今天coding时用到上面这段代码,突然想到 Object.toString
方法,为啥两者不一样呢Object
的 toString
并不是自有属性,而是继承属性
那 Object
究竟时继承的谁呢,或者换句话说,Object
时由什么构造的呢?
Object.toString.call([])
为啥运行上面这段代码会提示 Function.prototype.toString requires that 'this' be a Function
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
又是由什么构造的呢
console.log(Function.__proto__.constructor) // ƒ Function() { [native code] }
我们看到 Function
是由 Function
构造的
那么是不是说 Function
就是继承链的最顶层了呢? 答案肯定是 不是
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
的
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。