Javascript原型(三)

代碼分析(一)

function Phone(ram) {
    this.ram = ram;
    this.call = function(){}
}
var p = new Phone("16GB");
var q = new Phone("32GB");
  • 首先分析構造函數 Phone,定義一個 Phone 構造函數(由於下面是要對此函數使用 new 操做建立新對象的,因此這裏說
    Phone 是構造函數,其實若是說 Phone 是一個普通函數也是能夠的)函數

    function Phone(ram) {
        this.ram = ram;
        this.call = function(){}
    }

    clipboard.png

    注意:this

    1. 在此圖中,並無ramcallramcall是構造函數體裏的東西,是構造函數經過new建立出的對象裏的屬性(絕對不要理解成是構造函數自己的屬性),也就是說this.ram=ram,是新建立出來的對象裏面有個ram屬性,值是建立對象時從外部傳遞進來的值。
    2. 構造函數自己有什麼屬性呢?構造函數自己有name屬性,凡是函數都有一個屬性叫作name。好比Person這個構造函數,它的name屬性值就是Person;而`var
      person = function(){...};像這樣的聲明,name屬性的值就是person`。以下圖所示:

      clipboard.png

以上代碼完整的圖以下所示:spa

clipboard.png

代碼分析(二)

function Phone() {
    this.ram = "16GB";
}
Phone.prototype.call = function(){}
var p = new Phone();
var q = new Phone();

clipboard.png

  • Phone構造函數中有prototype原型屬性,此屬性指向原型
  • 原型中有constructor屬性,此屬性指向構造函數
  • 原型有call屬性,此屬性指向一個函數
  • 經過Phone構造函數,實例化出了兩個對象,這兩個實例對象中分別都有__proto__原型對象屬性,此屬性指向原型,與Phone構造函數中的prototype屬性指向的是同一對象
  • 正是因爲pq對象都指向同一個原型對象,因此當調用p.call()或者q.call()的時候,即便實例化對象自己中不存在此方法,此方法也會正常執行,由於實例化對象中沒有,就會自動去原型中查找,原型中有,就調用了,這也就是原型繼承
  • 開發中的用法是在構造函數中定義屬性,在原型中定義方法

代碼分析(三)

function Phone(){
    this.ram = "16GB";
}
Phone.prototype = {
    sayHello: function(){}
};
var p = new Phone();
var q = new Phone();

內存圖以下所示:prototype

clipboard.png

右上角的剛開始的原型對象(有constructor的),沒有任何屬性指向它了,時間長了,它就被回收了,可是在沒回收以前,它是存在的,並非一沒有東西指向它了,它就消失了。code

相關文章
相關標籤/搜索