javascript的哲学,Function构造函数的神奇之处!我生了我!

先来看一段代码

Object instanceof Function;//true
Function instanceof Object;//true

能理解吗?

首先介绍 instanceof 运算符,instanceof 运算符用于检测,构造函数的 prototype 属性,是否出现在,某个实例对象的原型链上。

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}

const auto = new Car('Honda', 'Accord', 1998);

console.log(auto instanceof Car);// true
console.log(auto instanceof Object);//  true

换句话来说,以上面代码为例子,就是 auto 这个实例的原型链上, 有没有 Car.prototype 这个对象。

很明显 auto 这个对象是构造函数 Car 的实例,必然继承 Car.prototype ,所以必然是 true 。

除了 null ,所以对象都继承 Object.protype ,所以 auto 也继承 Object.protype。

下面好玩了,先解释第一段代码

Object instanceof Function  // true

我们都知道,Object 是一个内置的构造函数,所以这行代码表示的是, Object 这个构造函数的原型链上,有没有 Function.prototype 这个对象。

而 Object 是一个构造函数,所以必然是一个函数。我们知道,任何函数都是由 Function() 这个构造函数的实例,所以必然继承了 Function.prototype 。

 

而且再往上追溯,Function.prototype 也是一个对象,任何对象都是 Object 构造函数的实例,所以 Function.prototype 继承了 Object.prototype,

所以 Object instanceof Object  也是 true 。

Object instanceof Object; //true

至于

Function instanceof Object;//true 

因为 Function() 是函数,所以数据类型也是对象,任何对象都继承 Object.prototype,所以必然是 true 。

好了,真正神奇的地方来了,看这段代码

Function instanceof Function;//true 

怎么理解呢?在这里,Function 如果理解成普通对象 ,那么就是 Object 构造函数的实例,所以原型链上有 Object.prototype 这个对象。再往上就只有 null 了。原型链上找不到 Function.prototype 这个对象,所以在这里不能理解成普通对象。

那么 Function 在这里理解成一个构造函数,那么我 Function 就是一个函数,我们都知道,所有的函数都是构造函数 Function 生成的,全部都继承 Function.protype 这个对象 ,所以上面打印的是 true 。

 

等一下,再让我理一遍,我是 Function ,一个内置的构造函数,所以我是函数。而函数都是内置构造函数 Function 的实例,在这里,“我生了我?!”

我在风中凌乱。。。

使用 constructor 方法也能看出来,貌似真的是这样的。

Function.prototype.constructor ===Function //true

很神奇,Function 对象是由自己本身  Function构造函数 生成的,就是“我生了我”。

console.log(Function.hasOwnProperty('constructor'));false

constructor 这个属性只存在于 Function.prototype 中,所以确定 Function.prototype 的构造函数是 Function。我生了我石锤

上一篇:java中instanceof用法


下一篇:springboot利用aop切面实现自定义注解-校验入参