原型(prototype):
一个简单的对象,用于实现对象的属性继承。可以简单的理解成对象的爹。在Firefox和Chrome中,每个JavaScript对象中都包含一个_proto_(非标准)的属性指向它爹(该对象的原型),可 obj.proto 进行访问。
- 所有引用类型都有一个_proto_(隐式原型)属性,属性值是一个普通的对象。
- 所有函数都有一个prototype(原型)属性,属性值是一个普通的对象。
- 所有引用类型的 proto 属性指向它构造函数的prototype。
构造函数:
可以通过 new 来新建一个对象的函数。
实例:
通过构造函数和new创建出来的对象,便是实例。实例通过 proto 指向原型,通过constructor指向构造函数。
三者的关系:
实例.proto === 原型
原型.constructor === 构造函数
构造函数.prototype === 原型
原型链:
原型链是由原型对象组成,每个对象都有 proto 属性,指向了创建该对象的构造函数的原型,proto 将对象连接起来组成了原型链。是一个用来实现继承和共享属性的有限的对象链。
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的_proto_隐式原型上查找,即它的构造函数的prototype。如果还是没有找到就会再在构造函数的prototype的_proto_中查找,这样一层一层向上查找就会形成一个链式结构,称为原型链。
属性查找机制:当查找对象的属性时,如果实例对象自身不存在该属性,则沿着原型链往上一级查找,找到则输出,不存在时,则继续沿着原型链往上一级查找,直至最顶级的原型对象 object.prototype,如果还是没找到,则输出 undefined。
属性修改机制:只会修改实例对象本身的属性,如果不存在,则进行添加该属性,如果需要修改原型的属性时,则可以用: b.prototype.x = a; 但是这样会造成所有继承于该对象的实例的属性发生改变。