Javascript 原型和原型鏈

先來了解一下Javascript中的原型:」原型也是一個對象,原型能夠用來實現繼承。。。「javascript

對於 原型,構造函數,以及實例之間的關係:「每一個(構造)函數都有一個原型屬性,原型對象都包含一個指向構造函數的指針,每一個實例都包含一個指向原型對象的指針。」java

 舉個例子:函數

1       function Student(name) {
2           this.name = name;
3       }
4       var stu = new Student("xiao ming");

Student 函數有個prototype的屬性,它指向Student的原型對象。Student的原型對象 包含一個constructor的屬性 和 一個 __proto__ 的屬性. constructor屬性指向Student 函數, __proto__指向Object的原型(在javascript中全部對象都是繼承Object)。Student 函數如圖所示:this

 在代碼中咱們還建立了一個Student函數的實例 stu, 它會有一個指針__proto__指向Student 原型對象.spa

注意:stu 中會多一個name 屬性,屬性是存在於實例中,而不是函數,或者函數的原型中,這點很是容易出錯。stu 實例 以下圖:prototype

因此,前面例子整個的對象示意圖 就是:指針

原型鏈:若是把構造函數(A)的實例賦給另外一個構造函數(B)的原型,那麼函數B, 函數A的實例, 以及函數A之間就會造成一個原型鏈。B的實例就會繼承A的全部屬性和方法。code

若是此時咱們把stu 再賦給其它對象的原型,從圖中能夠看出,紅色線條部分就會造成一個原型鏈。對象

用原型鏈實現繼承的例子:blog

      function Person() {
          this.hasFriends = true;
          this.friends = ["David"];
      }
      Person.prototype.getHasFriend = function () {
          alert(this.hasFriends);
      }
      function Student() {
          this.hasGF = false;
      }
      Student.prototype = new Person();
      Student.prototype.getScore = function () {
          alert(this.hasGF);
      }
      var stu = new Student();
      stu.getFriends();
      stu.friends.push("Lily");
      var newStu = new Student();
      alert(newStu.friends);
相關文章
相關標籤/搜索