《JavaScript》——物件導向之原型

來源:互聯網
上載者:User

標籤:web開發   javascript   

    上一篇文章我主要介紹的是在JavaScript裡對象的建立,可是,在對象的建立過程中有很多知識我們還沒有學習,那就是原型,原型式什麼東東哪?在這裡我想用自己的理解跟大家說說,有不對的地方大家可以給我提意見。

    首先說,原型就是對象,這個對象中的屬性和方法可以被共用,被誰共用哪?就是被執行個體們共用(當我們建立一個對象後,然後再用這個對象去執行個體化許多執行個體)。

    我們建立的每個對象都有一個 prototype(原型)屬性,這個屬性是系統自動建立的,通過這個屬性(prototype)就可以直接存取到該對象的原型對象。例子如下所示。 

function Box() {}                    //聲明一個建構函式Box.prototype.name = '美女';         //在原型裡添加屬性Box.prototype.age = 20;Box.prototype.run = function () {    //在原型裡添加方法return this.name + this.age + '看我這...';};

    其中Box.prototype代表訪問到了Box()對象的原型,Box.prototype.age=20,表示給Box()的原型對象的age屬性賦值為20。現在,聲明兩個Box()對象的執行個體看看。

var box1 = new Box();var box2 = new Box();alert(box1.run == box2.run);         //返回true,說明它倆的run引用地址是一樣的。


 

    從上面的圖中可以看出,執行個體box1和box2,都能通過建構函式對象Box去訪問Box prototype,而Box prototype中放的一些方法和屬性就是被box1和box2所共用的。

    prototype 下有兩個方法:apply()和 call(),每個函數都包含這兩個非繼承而來的方法。 這兩個方法的用途都在特定的範圍中調用函數, 實際上等於設定函數體內 this 對象的值。 我的理解是一個是傳參數用的對象冒充,一個是改變函數的範圍。對象冒充我的理解是指A對象冒充B對象後,A對象就會擁有B對象的屬性或者方法,但是B對象參考型別的屬性和方法不能被冒充。其實call()和apply()方法的作用是一樣的,這裡我只介紹一下call()方法。

    1、原型的call()方法(改變函數的範圍)

<span style="color:#000000;">var color = '紅色的';                       //或者 window.color = '紅色的';也行var box = {color : '藍色的'};function sayColor() {alert(this.color);}sayColor();                                //範圍在 window   返回紅色的。sayColor.call(this);                       //範圍在 window返回紅色的。sayColor.call(window);                     //範圍在 window 返回紅色的。sayColor.call(box);                        //範圍在box對象內 返回藍色的。</span>

    2、原型的call()方法(對象冒充)
           
function Box(name,age){this.name=name;this.age=age;run=function(){return this.name+this.age+"看我這.....";}}function Desk(name1,age1){Box.call(this,name1,age1);    //對象冒充調用,在這裡也是傳遞參數的作用。}var  a =new Desk('劉亦菲',15);alert(a.name);                        //返回劉亦菲alert(a.age);                         //返回15alert(a.run());                       //無傳回值,因為這是參考型別,不能使用對象冒充調用,如果想調用,需要將new Box()賦值給Desk的原型代碼如下//Desk.prototype=new Box()            //此方法是將對象Box()的執行個體和原型的資訊全部賦值給Desk對象。

    另外, 原型模式是有執行流程:1、先尋找建構函式執行個體裡的屬性或方法,如果有,立刻返回;2、如果建構函式執行個體裡沒有,則去它的原型對象裡找,如果有,就返回。這裡就不在匹配例子了。

   小結

   使用傳遞參數的建構函式建立執行個體,可以使不同的執行個體初始化不同的值,原型在對象的繼承中也起到了很大的作用,如果想知道原型在對象的繼承起到的作用,請看我的下一篇部落格,《JavaScript》——物件導向之繼承。

 

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

《JavaScript》——物件導向之原型

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.