標籤: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》——物件導向之原型