原型(prototype)
JavaScript每声明一个function,都有prototype原型,prototype原型是函数的一个默认属性,在函数的创建过程中由js编译器自动添加。
每一个基本对象都有自己的_proto_属性,而每一个函数对象都有自己的prototype原型(函数对象也属于基本对象,所以也有_proto_)
prototype是 构造函数 中的一个属性,指向原型
_proto_是实例中的一个属性,指向原型
原型用于储存类的共享属性(方法),相当于Java中的静态属性(方法)
下图是原型的示意图:


_ proto_
- 每个对象都有一个_proto_属性,这个_proto_指向一个结构体,这个结构体就是这个实例(对象)的原型,如下例:
var foo = {
x: 10,
y: 20
};

- 第二例:
var a = {
x: 10,
calculate: function (z) {
return this.x + this.y + z
}
};
var b = {
y: 20,
__proto__: a
};
var c = {
y: 30,
__proto__: a
};
b.calculate(30); // 60

注意:
- 如上图,一个没有继承操作的函数的_proto_都会指向Object.prototype,而Object.prototype都会指向null。
- 所以,也可以很明显知道,为何null是原型链的终端。
原型链
实例的_proto_指向实例的prototype,继承就是让这个prototype的_proto_指向父类的prototype。下例中,a是A的实例,a的_proto_指向A的prototype,其中的_proto_又指向父类Object的prototype。这就实现了继承A继承Object。
