三种角色: 普通函数 构造函数 普通对象

Function & Object的爱恨情仇

函数:普通函数(实名或者匿名函数) 箭头函数[没有prototype] 构造函数 生成器函数
对象:普通标准对象 标准特殊对象[Array] 非标准特殊对象 Function 也是对象 所有对象都有proto

  1. function Fn() {
  2. this.x = 100;
  3. this.y = 200;
  4. this.getX = function () {
  5. console.log(this.x);
  6. }
  7. }
  8. Fn.prototype.getX = function () {
  9. console.log(this.x);
  10. };
  11. Fn.prototype.getY = function () {
  12. console.log(this.y);
  13. };
  14. let f1 = new Fn;
  15. let f2 = new Fn;

Function 函数内置类【所有函数都是他的一个实例】
Function.prototype 本质是一个函数【匿名空函数】但是所有的操作和其它的原型对象一模一样

Function 和Object

  1. Function instanceof Function;//=>true

    Function.protype===Function.proto
    Function是Function类的实例
    2.Object instanceof Function ; =>true
    Object本身是个函数,所以他是Function类的一个实例
    Object.proto===Function.prototype
    3.Function instanceof Object ; =>true
    Function 是一个函数 但是函数一个对象,那么也都是Object类的实例
    Function.proto.proto===Object.prototype
    4.Object instanceof Object; =>true
    Object .proto.proto===Object.prototype

    进阶:函数的三种角色 - 图2总结

    Function是Object的实例 [Function]是函数也是对象 所以是Object的实例
    Fucntion 是Function的实例 [Function]是Function的实例
    Object 是 Function的实例 【Object】也是函数 所有函数都是他的实例

    1. function Foo() {
    2. getName = function () {
    3. console.log(1);
    4. };
    5. return this;
    6. }
    7. Foo.getName = function () {
    8. console.log(2);
    9. };
    10. Foo.prototype.getName = function () {
    11. console.log(3);
    12. };
    13. var getName = function () {
    14. console.log(4);
    15. };
    16. function getName() {
    17. console.log(5);
    18. }
    19. Foo.getName(); //2
    20. getName();//4
    21. Foo().getName();//1
    22. getName();//1
    23. new Foo.getName();//2
    24. new Foo().getName();//3
    25. new new Foo().getName();//3

    进阶:函数的三种角色 - 图3