「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
Function 类: 函数类
- 所有函数(类,普通函数) 都是Function 的一个实例
内置类:
Array、Number、String、Boolean、Object、Date、Function 、、、
console.log(typeof Array); // function
console.log(typeof String); // function
- 内置类和 Function类
内置类都是 Function 类的实例,而实例都有一个__proto__这个属性指向所属类的原型对象, JS 中所有函数都是 Function 的实例, 所以所有内置类,如Array 是函数,所以Array也是Function的实例;
console.log(Array instanceof Function); // true
既然是实例那么久一定会有原型关系
console.dir(Array); // 打印发现 Array 也是一个对象, 它也有 __proto__ 根据原型关系,Array 的 __proto__ 应该指向 Function的prototype
console.log(Array.__proto__ === Function.prototype); // true
console.log(Date instanceof Function); // true
console.log(Date.__proto__ === Function.prototype); // true
console.log(RegExp instanceof Function); // true
console.log(RegExp.__proto__ === Function.prototype); // true
console.log(Object instanceof Function); // true
console.log(Object.__proto__ === Function.prototype); // true
console.log(Function.prototype.__proto__ === Object.prototype); // true
- 因为 Object 也是一个类,所以也是一个函数,当然也就是 Function 的实例了 所以Object.__proto__指向Function.prototype
- 然而Function 本身也是一个类,也是一个函数,所以 Function 也有 prototype,而prototype也是一个对象,所以Function.prototype.__proto__又指向了Object.prototype
Function 和 Object的关系验证
- Object.proto 指向 Function.prototype
console.log(Object.__proto__ === Function.prototype);//true
- Function.prototype.proto 指向 Object.prototype
console.log(Function.prototype.__proto__ === Object.prototype);// true
- 所有的函数都是 Function 的实例
console.log(Array instanceof Function); // true
- 所有的引用数类型(普通对象、实例对象、函数、类、数组、Date)的都是 Object 这个基类的实例,所以函数也是对象;
console.log(Function instanceof Object);//true
console.log(Array instanceof Object);// true
console.log(Date instanceof Object);// true
let obj = {
id: 1
};
console.log(obj instanceof Object);// true
总结
- 所有的函数数据类型都是Function的实例
- Function 函数类本身也是一个函数
- 因为Function是自己的实例,所以Function.__proto__指向自己的prototype
- 而Function也是Object基类的实例;所以函数也是对象,可以有自己的私有属性
- Js 的内置引用数据类型都是Function的实例