这是本人珍藏的图,关系一目了然。
原型链&构造函数.png
-
显式原型
prototype
:函数/方法拥有一个prototype属性,指向函数的原型对象。(通过
Function.prototype.bind
方法构建的函数没有prototype属性) -
隐式原型
__proto__
:任意对象都有一个内置属性[[prototype]]
,大多浏览器支持通过__proto__
来访问,在ES5中有了对这个内置属性的标准Get方法:Object.getPrototypeOf()
(
Object.prototype
这个对象是个例外,它的__proto__
值为null ) (到终点) 原型链:这些对象及原型对象通过
__proto__
属性链接形成的链路结构就行原型链。原型链是由多级父对象逐级继承形成的。原型链保存着一个对象可用的所有属性和方法。原型链控制着属性和方法的使用顺序:就近原则--先子级后父级关系:
instance.constructor.prototype = instance.__proto__
1. {}.constructor === Object // true
2. {}.__proto__ === Object.prototype // true
// 任意对象的__proto__都指向Object.prototype
// constructor和prototype是相互反指的:构造函数和原型对象的互指的
// Object.prototype是一个对象,但是其指向null终点
function Fn(){} // true
3. Fn.constructor === Function // true
4. Fn.__proto__ === Function.prototype // true
5. Fn.__proto__ === Fn.constructor.prototype
// 任意函数的__proto 是 其构造函数(Function)的prototype
const foo = new Fn()
// foo是对象,通过new构建的都是对象,原型(prototype)也都是对象
6. foo.constructor === Fn // true
7. foo.__proto__ === Fn.prototype // true
8. foo.__proto__ === foo.constructor.prototype
// new出来的对象的__proto 是 其构造函数(继承来的)的prototype