原型、原型链、继承

322 阅读1分钟

原型(prototype)

  1. JavaScript每声明一个function,都有prototype原型,prototype原型是函数的一个默认属性,在函数的创建过程中由js编译器自动添加。

  2. 每一个基本对象都有自己的_proto_属性,而每一个函数对象都有自己的prototype原型(函数对象也属于基本对象,所以也有_proto_)

prototype是 构造函数 中的一个属性,指向原型

_proto_是实例中的一个属性,指向原型

原型用于储存类的共享属性(方法),相当于Java中的静态属性(方法)

下图是原型的示意图:

_ proto_

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

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

注意:

  1. 如上图,一个没有继承操作的函数的_proto_都会指向Object.prototype,而Object.prototype都会指向null。
  2. 所以,也可以很明显知道,为何null是原型链的终端。

原型链

实例的_proto_指向实例的prototype,继承就是让这个prototype的_proto_指向父类的prototype。下例中,a是A的实例,a的_proto_指向A的prototype,其中的_proto_又指向父类Object的prototype。这就实现了继承A继承Object。