js原型、原型链及继承

这是本人珍藏的图,关系一目了然。

原型链&构造函数.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

你可能感兴趣的:(js原型、原型链及继承)