1. function abc(){}
    2. const a = {}
    3. const b = Object.prototype
    4. console.log(a.prototype === b)
    5. console.log(Object.getPrototypeOf(a) === b)
    6. console.log(abc.prototype === Object.getPrototypeOf(abc))

    一. proto 隐式原型
    prototype 显式原型
    ①每一个函数在创建之后都会拥有一个名为prototype的属性,这个属性指向函数的原型对象。(需要注意的是,通过Function.prototype.bind方法构造出来的函数是个例外,它没有prototype属性)
    二: js中任意一个对象都有内置属性 [[prototype]],在es5之前没有标准方法访问,但是大多数浏览器支持通过proto来访问,
    es5中有了访问方法: Object.getPrototypeOf() (注意 Object.prototype是个例外,他的 proto 是null)

    三:两者关系:proto 指向创建这个对象的函数(constructor)的prototype

    重要理解上面这句话:proto指向哪里,指向创建这个对象的函数的显式原型!!!

    第一个console:prototype,显式原型,仅在函数内存在,在对象内是不存在的,为undefined
    第二个console:a的proto也就是 Object.getPrototypeOf(a) 是指向a的构造函数的原型,也就是Object.prototype,所以ok
    第三个console:
    f.prototype 和 Object.getPrototypeOf(f)说的不是一个事。

    f.prototype 是使用new 创建的 f的实例的原型。(备注:这里很别扭,f.prototype指的是使用new创建的f实例的原型,而不是f函数的原型。 f函数的原型在下面 ,Object.prototypeOf获取)
    f.prototype === Object.getPrototypeOf(new f()); // true

    Object.getPrototypeOf(f) 是f函数的原型
    Object.getPrototypeOf(f) === Function.prototype // true

    **Object.getPrototypeOf()** 方法返回指定对象的原型(内部[[Prototype]]属性的值)。
    function abc() {}, abc.prototype,表示abc的原型对象。
    Object。getPrototypeOf(abc) 他是 Function 的原型对象,指向创建这个对象的函数的显式原型(prototype,即原型对象)
    绕死了啊!!!!!!!!!!!!!!!!!!


    PS: 实例化的对象比如 var f1 = new Foo(),f1是没有 prototype

    只有函数才有对象,f1 是个对象。

    1. typeof f1 === object //true
    2. typeof Foo === function //true

    经典图:
    image.png