1、函数本身也有一些自己的属性
// length: 行参的个数
// name: 函数名
// prototype: 类的原型,在原型上定义的方法,都是当前Fn这个实例的公有的方法。
// _ proto _ 把函数当做一个普通的对象,指向Function这个类的原型
2.一个函数存在多面性
(1)、"普通函数":本身就是一个普通的函数,执行的时候行成私有的作用域(闭包),进行形参赋值、预解释、代码执行,执行完成后栈内存销毁或者不销毁;
(2)、"类": 它有自己的实例,也有一个叫做prototype的属性是自己的原型,它的实例都可以指向自己的原型;
(3)、"普通对象": 和let obj = {}一样,作为一个普通的对象,作为普通的对象,有一些自己私有的属性,也可以通过 _ proto _找到Function.prototype
// 上面三者之间没有必然的联系
Function.prototype是函数数据类型的值,操作和之前的一模一样
function Fn () {
var num = 100;
this.x = 200;
}
let f = new Fn; //Fn里面的this是f
Fn.aaa = 300;
f.num // undefined
f.aaa // undefined
let res = Fn(); // Fn里面的this是window
res // undefined
Fn.aaa // 300