js原型与原型链

在js中创建一个实例对象是通过一个构造函数来实现的

function obj(){
  this.text = "1";
}

使用这个构造函数实例化一个对象,这个 构造函数 中的操作 会为实例对象赋予 属性 和 方法 。

如: var txt1 = new obj();
构造函数中 this.text = "1" , this 指代 txt1 , 语句同等于 txt1.__proto__.text = "1"

这里的 __proto__ 是所有对象都有的一个 “原型” 对象。与之相对的是 prototype 对象。

prototype 对象是 构造函数 自带的,函数本身也是一个对象。

当要给构造函数添加新方法时会使用到,例如给 obj() 添加一个 read() 方法

obj.prototype.read = function(){
  console.log("text")
}

在给构造函数添加新方法后,已经实例化的对象也会具备这个方法,即

txt1.read()  // text

这是由对象自身的特性决定的,在使用对象方法或属性时,程序会现在该对象内部寻找(即 txt1. 的形式),若对象内部不存在这个属性或方法,程序会进入到 对象原型中寻找 (即 txt1.__proto__. 的形式),第二种寻找的途径就是原型链

如果这时为实例对象添加一个 read() 方法

txt1.read = function(){
  console.log("text2")
}

这种添加的方式并不会影响到 原型 obj构造函数的 read() 方法,新增的 read() 是txt1 特有的

 txt1.read() ; // text2
 txt1.__proto__.read() ; // text

到这里,原型 和 原型链 的使用规律 已经有轮廓了,即 新实例的对象自带一个__proto__ 对象,该对象指向 构造函数的 prototype 对象 或其 父对象。

 

参考链接:

JavaScript原型链以及Object,Function之间的关系
js中利用prototype给类添加方法
为什么实例没有prototype属性?什么时候对象会有prototype属性呢?
   还没有人评论 到此为止 | 继续阅读 >>