在javascript的世界中,一切皆对象,所有的对象皆来源于Object对象
既然所有的对象都是衍生于Object对象,那为啥表达式Object instanceof Function === true会成立呢??? 貌似是个鸡生蛋,蛋生鸡的问题😫😫,下面记录下个人对这个问题的理解
-
我们知道,在javascript中的继承关系大概是这样的:
null <- Object <- Function <- String <- Array <- Number ...... <- Person(我们自定义的函数) -
instanceof操作符的工作原理是查找原型链上原型的构造函数属性(prototype.constructor)是否存在恒等于表达式右侧的值,但由于[[prototype]]属性是内部属性,无法直接访问,所以一般通过__proto__属性(相当于原型对象的属性访问器getter/seeter)访问对象的原型。函数fun的实例对象f的原型__proto__上的构造函数constructor属性指向它的构造函数,即fun函数本身
function fun() {}
const f = new fun();
console.log(f instanceof fun); // true
console.log(f.__proto__.constructor === fun); // true
- javascript中的所有函数皆由
Function构造而来,所以下面的表达式是成立的
// 原始基本类型构造器
console.log(String.__proto__ === Function.prototype); // true
console.log(Number.__proto__ === Function.prototype); // true
console.log(Boolean.__proto__ === Function.prototype); // true
console.log(Symbol.__proto__ === Function.prototype); // true
console.log(Array.__proto__ === Function.prototype) // true
console.log(Date.__proto__ === Function.prototype); // true
console.log(RegExp.__proto__ === Function.prototype); // true
console.log(Error.__proto__ === Function.prototype); // true
......
由于表达式Object.__proto__ === Function.prototype和Object.__proto__.constructor === Function都成立,所以可以推论Object对象(也是构造函数)也是由Function派生的。故表达式Object instanceof Function === true是成立的
还有一个有趣的现象是Function的原型指向自身Function.__proto__ === Function.prototype