6
Object.prototype.toString.call(something)

上面这段代码一般被用来判断变量的类型,相信很多人都非常熟悉
今天coding时用到上面这段代码,突然想到 Object.toString 方法,为啥两者不一样呢
ObjecttoString 并不是自有属性,而是继承属性
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


王恩智
171 声望3 粉丝

打杂的大龄90后