函数有原型对象 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;}