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

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
    4-1.png

    总结:

    Function是Object的实例 //[Function]是函数也是对象 所以是Object的实例

    Fucntion 是Function的实例 //[Function]是Function的实例
    

    Object 是 Function的实例 //【Object】也是函数 所有函数都是他的实例2’M

    思考题

    function Foo() {
     getName = function () {
         console.log(1);
     };
     return this;
    }
    Foo.getName = function () {
     console.log(2);
    };
    Foo.prototype.getName = function () {
     console.log(3);
    };
    var getName = function () {
     console.log(4);
    };
    function getName() {
     console.log(5);
    }
    Foo.getName();  //2
    getName();//4
    Foo().getName();//1
    getName();//1
    new Foo.getName();//2
    new Foo().getName();//3
    new new Foo().getName();//3
    

    4-2.png