首页 > 代码库 > 原型链

原型链

javascript中没有类的概念,通过创建构造函数来创建以这个构造函数为模板的对象。

在JS中,函数共有两个功能:

  • 作为一般函数调用
  • 作为它原型对象的构造函数

 

创建一个函数

function fun_1(str_1){

  this.name = str_1;

}

这里发生了两件事:

  • 创建了一个函数对象,即fun_1
  • 创建了一个原型对象fun_1_proto

 

fun_1函数对象有一个prototype指针,指向fun_1_proto

fun_1_proto原型对象有一个constructor指针,指向其构造函数,即fun_1

 

var obj_1 = new fun_1();

fun_1.prototype.age = 99;

alert(obj_1.age);  //99

 

问题来了,为什么定义了原型对象中的成员变量,函数对象的实例也能访问到呢?

每个实例化的对象都有一个__proto__指针,指向其构造函数的原型对象

alert(obj_1.__proto__.age == fun_1.prototype.age);

alert(obj_1.__proto__ == fun_1.prototype);

 

访问实例化对象的属性时,首先会在实例化对象中寻找;若没有找到,则顺着__proto__指针到原型对象中去找,若还未找到,则返回undefined

此时引申出原型链的含义:由于所有对象中都有__proto__指针指向其构造函数的原型对象,程序寻找某个成员变量时,只要找不到,就顺着__proto__指针向上去查上级的原型对象,一层接一层,即形成了原型链。

 

实际开发中利用prototype增加属性,只在当前程序中起作用,还可以扩展系统类的功能

 

原型链