原型鏈介紹

什么是原型鏈:
每一個對象都有自己的原型,而原型也是對象,也有自己的原型,一次類推而形成的鏈式結(jié)構(gòu)就叫做原型鏈

對象訪問原型鏈中的成員采用就近原則
1.如果自己本身有就去自己的,如果自己沒有就從原型中找,如果原型中也沒有就從原型的原型中找,一次類推知道找到原型鏈的終點null,如果還沒有找到是屬性就返回undefined , 如果是方法就返回xxx is not a function.

js中的對象都是由構(gòu)造函數(shù)創(chuàng)建的
1.自定義構(gòu)造函數(shù)

        function Person(name,age){
            this.name = name;
            this.age = age;
        };

        //每一個人都可以打招呼淑仆,可以添加到原型中
        Person.prototype.sayHi = function(){
            console.log('今天六一兒童節(jié)囤官,今晚請你洗剪吹');
        };

        //人類屬于哺乳動物,可以添加到原型中
        Person.prototype.type = '哺乳動物';

        var p1 = new Person('班長',20);

        console.log(p1);
        
        /*面試題 :請說出下面程序運行的結(jié)果
         */
         console.log(p1.name);//班長    p1自己有name屬性
         console.log(p1.type);//哺乳動物  p1自己雖然沒有type屬性陕见,但是它的原型有type
         p1.sayHi();//    p1自己雖然沒有sayHi方法泣侮,但是它的原型有

        //對象取值:不存在undefined
         console.log(p1.girlFriend);//undefined   p1自己沒有g(shù)irlFriend即彪,原型也沒有,
         //p1.eat();//程序報錯  eat is not a function    p1自己沒有eat方法活尊,原型也沒有隶校,

        //為什么不報錯? p1自己沒有toString  p1的原型也沒有toString  但是p1的原型的原型有toString
         console.log(p1.toString());


         //1.查看p1的原型
         console.log(p1.__proto__.constructor);//Person
         console.log(p1.__proto__ === Person.prototype);//true

         //2.查看p1原型的原型
        console.log( p1.__proto__.__proto__.constructor);//Object
        console.log( p1.__proto__.__proto__ === Object.prototype);//true

        //3,查看p1的原型的原型的原型
        console.log(p1.__proto__.__proto__.__proto__);//null

2.查看內(nèi)置對象的原型鏈

        //1.Array對象
        var arr = [10,20,30];// new Array(10,20,30)

        //查看數(shù)組對象的原型鏈
        console.log(arr.__proto__.constructor);//Array
        console.log(arr.__proto__ === Array.prototype);//true

        //查看數(shù)組對象的原型的原型
        console.log(arr.__proto__.__proto__.constructor);//Object
        console.log(arr.__proto__.__proto__ === Object.prototype);//true

        console.log(arr.__proto__.__proto__.__proto__);//null

        console.log(arr);

        arr.push();//js作者將數(shù)組所有的API都放入了Array酬凳。prototype中惠况,這樣所有的數(shù)組對象都可以直接調(diào)用

        arr.toString();//所有的對象原型鏈都會指向Object.prototype,這就意味著任何對象都可以調(diào)用Object原型中的方法
        
        
        //2.Date對象

        var date = new Date();
            細節(jié):日期對象不能直接用log,會自動轉(zhuǎn)成toString字符串
        console.log(date);
        //查看對象內(nèi)存空間  console.dir()
        console.dir(date);

        //查看date的原型
        console.log(date.__proto__.constructor);//Date
        console.log(date.__proto__ === Date.prototype);//true

        //查看date的原型的原型鏈
        console.log(date.__proto__.__proto__.constructor);//Object
        console.log(date.__proto__.__proto__ === Object.prototype);//true
        
        
        //3.String對象(基本包裝類型  new String new Number new Boolean)
        var str = new String('123');
        console.log(str);

        //查看str對象的原型
        console.log(str.__proto__.constructor);//String
        console.log(str.__proto__ === String.prototype);//true

        //查看str對象原型的原型
        console.log(str.__proto__.__proto__.constructor);//Object
        console.log(str.__proto__.__proto__ === Object.prototype);//true
        
        
        //4.DOM對象

        var box = document.getElementById('box');
        var p1 = document.getElementById('p1');

        console.log(box);//打印HinnerHTML
        console.dir(box);//打印對象內(nèi)存空間
        console.dir(p1);

3.函數(shù)也是對象類型:
驗證:對象擁有點語法動態(tài)添加屬性宁仔,如果函數(shù)也能像對象一樣擁有點語法動態(tài)添加屬性

  function fn(){
            console.log('11111');
        };

        fn.sb = function(){
            console.log('一群大雁飛過稠屠,一會兒拍成了s形,一會兒又拍成了b形');
        };

        fn.aaa = '我是函數(shù)的屬性';


        fn.sb();
        console.log(fn.aaa);

        //log:打印函數(shù)中存儲的代碼
        console.log(fn);
        //dir:打印函數(shù)對象中存儲的屬性
        console.dir(fn);

        //2.既然函數(shù)也是對象(所有的對象都是構(gòu)造函數(shù)創(chuàng)建)翎苫,那么函數(shù)對象又是誰創(chuàng)建的呢权埠?

        /* 函數(shù)是一個特殊的對象,所有的函數(shù)都是由Function構(gòu)造函數(shù)創(chuàng)建 */
        console.log(fn.__proto__.constructor);//Function
        console.log(fn.__proto__ === Function.prototype);//true


        console.log(Object.__proto__.constructor);//Function
        console.log(Array.__proto__.constructor);//Function

由上面的介紹基本上已經(jīng)可以大概了解原型鏈的雛形啦,下面就是原型鏈的完整版

06-完整的原型鏈.png

由原型對象看instanceof

 <script>
        /* 
        instanceof運算符工作原理:   對象 instanceof 構(gòu)造函數(shù)
            規(guī)則: 檢查右邊構(gòu)造函數(shù)的原型煎谍,在不在左邊對象的原型鏈中
         */

        //1.Array
        /*根據(jù)instanceof的運算規(guī)則: 左邊Array是對象攘蔽,右邊是構(gòu)造函數(shù)
        Array構(gòu)造函數(shù)對象的原型鏈:Array對象.__proto__ -> Function.prototype -> Object.prototype -> null 
        
         */
        console.log(Array instanceof Object);//true
        console.log(Array instanceof Function);//true
        console.log(Array instanceof Array);//false

        //2.Function
        /* 
        根據(jù)instanceof運算符規(guī)則:左邊Function是對象,右邊的Function是構(gòu)造函數(shù)

        Function對象的完整原型鏈: Function -> Function.prototype - > Object.prototype -> nulll

         */

        console.log(Function instanceof Function);//true
        console.log(Function instanceof Object);//true


        //3.Object
        /* 
        根據(jù)instanceof運算符規(guī)則:左邊Object是對象呐粘,右邊的Object是構(gòu)造函數(shù)

        Object對象的完整原型鏈: Object -> Function.prototype - > Object.prototype -> nulll

         */
        console.log(Object instanceof Function);//true
        console.log(Object instanceof Object);//true 
    </script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末满俗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子作岖,更是在濱河造成了極大的恐慌唆垃,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痘儡,死亡現(xiàn)場離奇詭異辕万,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門渐尿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醉途,“玉大人,你說我怎么就攤上這事砖茸“妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵凉夯,是天一觀的道長嵌屎。 經(jīng)常有香客問我,道長恍涂,這世上最難降的妖魔是什么宝惰? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮再沧,結(jié)果婚禮上尼夺,老公的妹妹穿的比我還像新娘。我一直安慰自己炒瘸,他們只是感情好淤堵,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顷扩,像睡著了一般拐邪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隘截,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天扎阶,我揣著相機與錄音,去河邊找鬼婶芭。 笑死东臀,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的犀农。 我是一名探鬼主播惰赋,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呵哨!你這毒婦竟也來了赁濒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤孟害,失蹤者是張志新(化名)和其女友劉穎拒炎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纹坐,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡枝冀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了耘子。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片果漾。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谷誓,靈堂內(nèi)的尸體忽然破棺而出绒障,到底是詐尸還是另有隱情,我是刑警寧澤捍歪,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布户辱,位于F島的核電站,受9級特大地震影響糙臼,放射性物質(zhì)發(fā)生泄漏庐镐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一变逃、第九天 我趴在偏房一處隱蔽的房頂上張望必逆。 院中可真熱鬧,春花似錦揽乱、人聲如沸名眉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽损拢。三九已至,卻和暖如春撒犀,著一層夾襖步出監(jiān)牢的瞬間福压,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工或舞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留隧膏,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓嚷那,卻偏偏與公主長得像胞枕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子魏宽,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容