函数有原型对象 prototype,new 实例有隐式原型 __proto__

原理

    let F = function(){}    let f1 = new F()    F:    {      constructor: Function,      __proto__: Function.prototype      prototype: {        constructor: F        __proto__: Object.prototype      }    }    f1:    {      constructor: F,      __proto__: F.prototype    }

字面量的形式

  let obj = {} // 相当于 let obj = new Object()  obj.constructor === Object  obj.__proto__ === Object.prototype

Object.create() 形式

  let obj1 = { a: 1 }  let obj2 = Object.create(obj1)  obj2.constructor === Object  obj2.__proto__ === obj1

构造函数的形式

var F = function(){}var f1 = new F()F.constructor === FunctionF.__proto__ === Function.prototypeF.__proto__ === Function.__proto__F.__proto__.__proto__ === Object.prototypeF.prototype.constructor === FF.prototype.__proto__ === Object.prototypef1.constructor === Ff1.__proto__ === F.prototype

class

class A {}class B extends A {}A.__proto__ === Function.prototypeA.prototype.constructor === AA.prototype.__proto__ === Object.prototypeB.__proto__ === AB.prototype.constructor === BB.prototype.__proto__ === A.prototype// B 的实例继承 A 的实例Object.setPrototypeOf(B.prototype, A.prototype)// B 继承 A 的动态属性Object.setPrototypeOf(B, A)Object.setPrototypeOf = function (obj, proto) {  obj.__proto__ = proto;  return obj;}