原型和原型链及继承
构造函数,原型和实例的关系:
每个构造函数(constructor)都有一个原型对象(prototype),原型对象都包含一个指向构造函数的指针,而实例(instance)都包含一个指向原型对象的内部指针.
基础概念:
- js 分为函数对象和普通对象,每个对象都有
[[Prototype]]
属性,但是只有函数对象才有 prototype 属性 - Object、Function 都是 js 内置的函数, 类似的还有我们常用到的 Array、RegExp、Date、Boolean、Number、String
- 属性
[[Prototype]]
是一个对象,它有两个属性,constructor 和[[Prototype]]
; - 原型对象 prototype 有一个默认的 constructor 属性,用于记录实例是由哪个构造函数创建;
设计原型链的两个准则:
// **准则1:原型对象(即Person.prototype)的constructor指向构造函数本身**
1. Person.prototype.constructor == Person
// **准则2:实例(即person01)的__proto__和原型对象指向同一个地方**
2. person01.__proto__ == Person.prototype
Function 是最顶层的构造器,Object 是最顶层的对象;从原型链讲 Function 继承了 Object,从构造器讲 Function 构造了 Object