先來了解一下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);