快速理解原型鏈

1、構造函數、原型對象、實例

來個例子認識一下:函數

 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 操做符來使用。this

Person.prototype 就是原型對象spa

而person1 就是Person的一個實例。prototype

2、構造函數、原型對象、實例 三者的關係

1)構造函數有一個原型對象(Person.prototype)
2)原型對象包含一個指向構造函數的指針
 
1  Person.prototype.constructor == Person // true 
 
3)實例包含一個指向原型對象內部的指針
  能夠經過 isPrototypeOf() 方法來確認指向的原型對象
1 console.log(Person.prototype.isPrototypeOf(person1)); // true

 

3、原型鏈的造成指針

基本的實現原理就是強制的讓一個對象的原型等於另外一個對象的實例。那麼這個對象的原型就擁有了一個指向另一個對象的原型對象的內部指針。
如今咱們有兩個對象,對象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())  //  會在原型鏈上查找 

這就是一個簡單的原型鏈實現了,當出現第三個對象、第四個對象這樣鏈式的寫下去,原型鏈將會更長。code

相關文章
相關標籤/搜索