原型和原型鏈

1.普通對象與函數對象

在JavaScript中,萬物皆對象。對象分爲普通對象和函數對象,那麼怎麼區分普通對象和函數對象呢?函數

function是js中自帶的函數對象。經過new function()建立的對象都是函數對象。其餘的都是普通對象。this

<script>
  var a1 = function(){};
  var a2 = new Function('小明');
  function a3(){};

  var b1 = {};
  var b2 = new Object();
  var b3 = new a3();
  console.log(typeof a1);//function
  console.log(typeof a2);//function
  console.log(typeof a3);//function
  console.log(typeof b1);//object
  console.log(typeof b2);//object
  console.log(typeof b3);//object

</script>

從上面代碼中能夠看出a1,a2,a3爲函數對象,b1,b2,b3爲普通對象。spa

2.原型對象

  在JavaScript中每當定義一個函數對象,對象都會包含一些預約義的屬性,每一個函數都有一個prototype屬性(原型屬性),這個屬性是一個指針,指向一個對象(原型對象),注:普通對象沒有prototype,但有__proto__屬性。prototype

如今建立一個函數看看,原型是什麼?指針

<script>
  var test=function(){};
  console.log(test.prototype);//object{}
</script>

咱們能夠看到原型就是一個空的對象,既然是一個對象,咱們就能夠爲他添加屬性和方法。code

<script>

  var test=function(){};
  test.prototype.getName=function(){
    return this.name;
  }

</script>

原型對象是用來作什麼的呢?主要做用是用於繼承。舉了例子:對象

var cart= function(name){
   this.name = name
  };
 cart.prototype.getName = function(){
     return this.name; 
  }
  var myCart= new cart(‘蘭博基尼’);
  myCart.getName(); //蘭博基尼

咱們能夠看到,原型對象上添加的屬性和方法,在函數建立的實例中依然可使用,這說明什麼?blog

原型對象中的屬性和方法是全部實例共享的。繼承

3.原型鏈

JS在建立對象(不管是普通對象仍是函數對象)的時候,都有一個叫作__proto__的內置屬性,用於指向建立它的函數對象的原型對象prototype。以上面的例子爲例:ip

<script>
  var test=function(){};
  test.prototype.name="小明";
  test.prototype.sex="男";
  test.prototype.getName=function(){
    console.log(this.name);
  }
  var a1=new test();
  console.log(test.prototype);
  console.log(a1);
</script>

   咱們能夠看到,test的原型對象和一個實例對象都有一個__proto__對象,可是指向不一樣,原型對象中的__proto__指向Object,而實例中的__proto__指向內部明叫test的對象,展開這個對象能夠看到就是原型對象。就是說每個實例中有一個__proto__屬性指向原型對象。每個實例的內部都包含一個內部屬性__proto__,指向了構造函數的原型,就是這個屬性鏈接了實例和原型對象之間的關係,而且咱們知道實例中不包含name屬性和getName方法,可是咱們卻使用了getName(),就是經過這個__proto__屬性查找的。

JS在建立對象(不管是普通對象仍是函數對象)的時候,都有一個叫作__proto__的內置屬性,用於指向建立它的函數對象的原型對象prototype。

 console.log(zjh.__proto__ === person.prototype) //true

一樣,person.prototype對象也有__proto__屬性,它指向建立它的函數對象(Object)的prototype

  console.log(person.prototype.__proto__ === Object.prototype) //true

繼續,Object.prototype對象也有__proto__屬性,但它比較特殊,爲null

  console.log(Object.prototype.__proto__) //null

咱們把這個有__proto__串起來的直到Object.prototype.__proto__爲null的鏈叫作原型鏈

4.isPrototypeOf查找原型

使用方法a.isprototypeOf(b),判斷對象a是不是實例b__proto__指向的原型對象,若是是返回true,不然返回false。看個例子

 var test = function test(){}
  test.prototype.name = "小明";
  test.prototype.age = "25";
  test.prototype.getName = function(){console.log(this.name);}
  var o1 = new test();

  console.log(test.prototype.isPrototypeOf(o1));//true

5、總結

1.原型和原型鏈是JS實現繼承的一種模型。2.原型鏈的造成是真正是靠__proto__ 而非prototype。

相關文章
相關標籤/搜索