1. 程式人生 > >對原型鏈相關的知識的梳理

對原型鏈相關的知識的梳理

.proto 情況下 所有 ons com 一個 註釋 _proto_ 指向

 <script>
    function Obj(uName,uAge){
        this.name=uName;
        this.age=uAge;
        this.fn_1=function(){
            alert(this.name+‘,‘+this.age);
        }
    }
    Obj.prototype.fn_1=function(){
        alert(this.age+‘,‘+this.name)
    }
    var test=new Obj(‘小紅‘,23);
    test.fn_1();
</script>

在上段代碼中,

首先有一個構造函數Obj,

通過代碼可知,在構造函數Obj中有有兩個屬性name與age,有一個方法fn_1。

在每個函數中,都有會有一個隱藏的屬性,叫做prototype即原型屬性,如下圖:

技術分享

Obj的原型屬性prototype指向的則是Obj的原型對象,即Obj.prototype。

Obj.prototype.fn_1=function(){
        alert(this.age+‘,‘+this.name)
    }

在代碼中通過原型屬性在Obj的原型對象裏面添加了一個fn_1的方法,如下圖:

技術分享

var test=new Obj(‘小紅‘,23);

通過構造函數Obj聲明了一個叫做test的對象,對象參數為‘小紅’,23.

在這個被聲明的test中,是沒有構造函數Obj中的原型屬性prototype的,

只有一個隱式原型_proto_,

而這個隱式原型_proto_是指向其構造函數的原型對象的,即Obj.prototype,如下圖:

技術分享

最後test.fn_1( )調用函數,由於在原型鏈中存在一個就近原則,即:

若對象中沒有,則順著原型鏈向上一級一級查找,由於對象中存在fn_1,所以執行對象中的fn_1.

技術分享

將構造函數中的方法註釋

    <script>
        function Obj(uName,uAge){
            
this.name=uName; this.age=uAge; // this.fn_1=function(){ // alert(this.name+‘,‘+this.age); // } } Obj.prototype.fn_1=function(){ alert(this.age+‘,‘+this.name) } var test=new Obj(‘小紅‘,23); test.fn_1(); </script>

這樣在構造函數與對象中都不存在fn_1了

技術分享

這樣在調用函數時只能通過隱式原型_proto_向上查找,找到了在原型對象上的fn_1,並執行,執行結果

技術分享

有結果可知,執行了在原型對象上的fn_1.

已知,每個對象上都存在_proto_隱式原型,那麽可以知道,在Obj.prototype原型對象上也存在一個隱式原型_proto_,

那這個隱式原型指向哪兒呢?

構造函數的隱式原型_proto_指向Object.prototype,即Object的原型對象。

在默認情況下,所有原型對象都會自動獲得一個constructor屬性,該屬性包含一個指向prototype屬性所在的函數。所以如下圖所示:

技術分享

在Object的原型對象中也存在_proto_隱式原型,不過該隱式原型指向為空。

就這樣,通過原型鏈,把函數環環相扣,使聲明的函數Obj也能夠調用Object裏面的方法。

對原型鏈相關的知識的梳理