快速理解原型链
一、构造函数、原型对象、实例
来个例子认识一下:
1 function Person() { 2 3 } 4 Person.prototype.name = '原型对象上定义的属性'; 5 Person.prototype.sayName = function () { 6 console.log('原型对象上的方法'); 7 } 8 9 var person1 = new Person(); 10 person1.sayName(); // '原型对象上的方法'
这里的 Person 就是一个构造函数,和普通的函数是一样的,只是构造函数要通过new 操作符来使用。
Person.prototype 就是原型对象
而person1 就是Person的一个实例。
二、构造函数、原型对象、实例 三者的关系
1)构造函数有一个原型对象(Person.prototype)
2)原型对象包含一个指向构造函数的指针
1 Person.prototype.constructor == Person // true
3)实例包含一个指向原型对象内部的指针
可以通过 isPrototypeOf() 方法来确认指向的原型对象
1 console.log(Person.prototype.isPrototypeOf(person1)); // true
三、原型链的形成
基本的实现原理就是强制的让一个对象的原型等于另一个对象的实例。那么这个对象的原型就拥有了一个指向另外一个对象的原型对象的内部指针。
现在我们有两个对象,对象1 和对象2 ,
我们让对象2的原型指向对象1 的实例,那么对象2就包含了对象1 的原型指针,
而对象1的原型对象中又包含着指向构造函数1的指针,
那么这个时候出现了对象3 , 对象3的原型对象又指向了对象2的实例。好像有点绕,我们来看一个例子:
1 function typeOne() { // 这就是对象1 2 this.val = true; 3 } 4 typeOne.prototype.getTypeOneVal = function(){ 5 return this.val; 6 } 7 8 function typeTwo(){ 9 this.valTwo = false; 10 } 11 typeTwo.prototype = new typeOne(); // 让对象2的原型指向对象1的实例,这时候对象2的原型上就有了对象1拥有的属性和方法 13 console.log(typeTwo.prototype.getTypeOneVal()) // true 14 15 //这时候再实例化 typeTwo 16 17 var instance = new typeTwo(); 18 console.log(instance.getTypeOneVal()) // 会在原型链上查找
这就是一个简单的原型链实现了,当出现第三个对象、第四个对象这样链式的写下去,原型链将会更长。

浙公网安备 33010602011771号