溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript的原型和原型鏈是什么

發布時間:2021-12-20 15:36:36 來源:億速云 閱讀:168 作者:小新 欄目:web開發

小編給大家分享一下javascript的原型和原型鏈是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一,函數對象

               所有引用類型(函數,數組,對象)都擁有__proto__屬性(隱式原型)

               所有函數擁有prototype屬性(顯式原型)(僅限函數)

               原型對象:擁有prototype屬性的對象,在定義函數時就被創建

二,構造函數

先復習下構造函數

//創建構造函數
        function Word(words){
            this.words = words;
        }
        Word.prototype = {
            alert(){
                alert(this.words);
            }
        }
        //創建實例
        var w = new Word("hello world");
        w.print = function(){
            console.log(this.words);
            console.log(this);  //Person對象
        }
        w.print();  //hello world
        w.alert();  //hello world

print()方法是w實例本身具有的方法,所以w.print()打印hello world;alert()不屬于w實例的方法,屬于構造函數的方法,w.alert()也會打印hello world,因為實例繼承構造函數的方法。

實例w的隱式原型指向它構造函數的顯式原型,指向的意思是恒等于

         w.__proto__ === Word.prototype

當調用某種方法或查找某種屬性時,首先會在自身調用和查找,如果自身并沒有該屬性或方法,則會去它的__proto__屬性中調用查找,也就是它構造函數的prototype中調用查找。所以很好理解實例繼承構造函數的方法和屬性:

w本身沒有alert()方法,所以會去Word()的顯式原型中調用alert(),即實例繼承構造函數的方法。

三,原型和原型鏈

        Function.prototype.a = "a";
        Object.prototype.b = "b";
        function Person(){}
        console.log(Person);    //function Person()
        let p = new Person();
        console.log(p);         //Person {} 對象
        console.log(p.a);       //undefined
        console.log(p.b);       //b

想一想p.a打印結果為undefined,p.b結果為b

解析:

p是Person()的實例,是一個Person對象,它擁有一個屬性值__proto__,并且__proto__是一個對象,包含兩個屬性值constructor和__proto__

        console.log(p.__proto__.constructor);   //function Person(){}
        console.log(p.__proto__.__proto__);     //對象{},擁有很多屬性值

我們會發現p.__proto__.constructor返回的結果為構造函數本身,p.__proto__.__proto__有很多參數

javascript的原型和原型鏈是什么

      我們調用constructor屬性,p.___proto__.__proto__.constructor得到擁有多個參數的Object()函數,Person.prototype的隱式原型的constructor指向Object(),即Person.prototype.__proto__.constructor == Object()

            從p.__proto__.constructor返回的結果為構造函數本身得到Person.prototype.constructor == Person()所以p.___proto__.__proto__== Object.prototype

所以p.b打印結果為b,p沒有b屬性,會一直通過__proto__向上查找,最后當查找到Object.prototype時找到,最后打印出b,向上查找過程中,得到的是Object.prototype,而不是Function.prototype,找不到a屬性,所以結果為undefined,這就是原型鏈,通過__proto__向上進行查找,最終到null結束

        console.log(p.__proto__.__proto__.__proto__);   //null
        console.log(Object.prototype.__proto__);        //null

大家理解剛才的過程,相信下面這些應該也都明白

        //Function
        function Function(){}
        console.log(Function);  //Function()
        console.log(Function.prototype.constructor);    //Function()
        console.log(Function.prototype.__proto__);      //Object.prototype
        console.log(Function.prototype.__proto__.__proto__);    //NULL
        console.log(Function.prototype.__proto__.constructor);  //Object()
        console.log(Function.prototype.__proto__ === Object.prototype); //true

總結:

1.查找屬性,如果本身沒有,則會去__proto__中查找,也就是構造函數的顯式原型中查找,如果構造函數中也沒有該屬性,因為構造函數也是對象,也有__proto__,那么會去它的顯式原型中查找,一直到null,如果沒有則返回undefined

2.p.__proto__.constructor  == function Person(){}

3.p.___proto__.__proto__== Object.prototype

4.p.___proto__.__proto__.__proto__== Object.prototype.__proto__ == null

5.通過__proto__形成原型鏈而非protrotype

最后附上一張圖,大家閱讀完之后,看圖應該可以很容易理解

javascript的原型和原型鏈是什么

以上是“javascript的原型和原型鏈是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女