摘要:重點實例對象是通過原型對象與構(gòu)造函數(shù)取得聯(lián)系的。原型鏈的形成是真正是靠的,而不是。函數(shù)對象和原型對象通過和屬性進(jìn)行相互關(guān)聯(lián)。
JavaScript 使用 prototypal 原型模型,雖然這經(jīng)常被當(dāng)作缺點提及,但是只要善于運用,其實基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。
個人博客排版更佳:https://haonancx.github.io/
先聊一聊對象的事情JavaScript 中,萬物皆對象!但對象也是有區(qū)別的,主要分為普通對象(Object)和函數(shù)對象(Function)。
說好的只聊技術(shù),怎么聊上個人問題了!?
好了,安慰一下,請你吃下面 這道菜!
function example(){}; var example2 = function(){}; var example3 = new Function("str","console.log(str)"); var other = {}; var other2 =new Object(); var other3 = new example(); console.log(typeof other); //object 下面檢測一下他們都是些什么類型函數(shù) console.log(typeof other2); //object console.log(typeof other3); //object console.log(typeof example); //function console.log(typeof example2); //function console.log(typeof example3); //function
怎么區(qū)分普通對象和函數(shù)對象呢?!其實很簡單,凡是通過 new Function() 創(chuàng)建的對象都是函數(shù)對象,其他的都是普通對象;所以 other、other2、other3 為普通對象,而 example、example2、example3 為函數(shù)對象。
在 JavaScript 中,每當(dāng)定義一個函數(shù)對象時候,對象中都會包含一些預(yù)定義的屬性(意思就是這個函數(shù)對象一旦被定義就必然會有這些屬性)。
其中函數(shù)對象的一個屬性就是原型對象 prototype;這個屬性會指向函數(shù)的原型對象。
默認(rèn)情況下每個原型對象又都會獲取一個 constructor 屬性,這個屬性包含一個指向 prototype 屬性所在函數(shù)的指針。
來來來,了解完對象,我們該開車上路了(老司機(jī)秒懂)
function Dogs(){ } Dogs.prototype.name = "Collie"; Dogs.prototype.age = 3; Dogs.prototype.DogsName = function(){ alert(this.name); }; var DogsA = new Dogs(); DogsA.DogsName();//"Collie"
上面的代碼中,創(chuàng)建了一個 Dogs 函數(shù),這時候它就會擁有一個 prototype 屬性,這個屬性指向了 Dogs Prototype 原型對象,而這個原型對象擁有一個 constructor (構(gòu)造函數(shù)) 屬性,其指針指向了 Dogs,就是 prototype 屬性所在的函數(shù) Dogs;當(dāng)你創(chuàng)建一個對象實例( DogsA,就是這條語句:var DogsA = new Dogs(); )的時候,同樣會擁有一個 prototype 屬性;這個 prototype 屬性會指向其原型對象,而不是直接指向其構(gòu)造函數(shù) Dogs。
我們可以測試一下,以上面的代碼為例:
console.log(DogsA._proto_ === Dogs.prototype) //true
同樣,Dogs.prototype對象也有 _proto _ 屬性,它指向創(chuàng)建它的函數(shù)對象(Object)的 prototype
console.log(Dogs.prototype._proto_ === Object.prototype) //true
好了繼續(xù),Object.prototype對象也有 _proto _屬性,但它比較特殊,為 NULL
console.log(Object.prototype._proto_) //null
我們把這個有 proto 串起來,直到 Object.prototype.__proto_ _為 NULL 的鏈就叫做原型鏈。
總結(jié)原型和原型鏈?zhǔn)?JS 實現(xiàn)繼承的一種模型。
原型鏈的形成是真正是靠 _proto _ 的,而不是 prototype。
所有的原型對象都有 constructor 屬性,該屬性對應(yīng)創(chuàng)建所有指向該原型的實例構(gòu)造函數(shù)。
函數(shù)對象和原型對象通過 prototype 和 constructor 屬性進(jìn)行相互關(guān)聯(lián)。
該文章部分知識網(wǎng)絡(luò)整理文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/86600.html
摘要:深入系列的第一篇,從原型與原型鏈開始講起,如果你想知道構(gòu)造函數(shù)的實例的原型,原型的原型,原型的原型的原型是什么,就來看看這篇文章吧。讓我們用一張圖表示構(gòu)造函數(shù)和實例原型之間的關(guān)系在這張圖中我們用表示實例原型。 JavaScript深入系列的第一篇,從原型與原型鏈開始講起,如果你想知道構(gòu)造函數(shù)的實例的原型,原型的原型,原型的原型的原型是什么,就來看看這篇文章吧。 構(gòu)造函數(shù)創(chuàng)建對象 我們先...
摘要:深入系列第十二篇,通過的模擬實現(xiàn),帶大家揭開使用獲得構(gòu)造函數(shù)實例的真相一句話介紹運算符創(chuàng)建一個用戶定義的對象類型的實例或具有構(gòu)造函數(shù)的內(nèi)置對象類型之一也許有點難懂,我們在模擬之前,先看看實現(xiàn)了哪些功能。 JavaScript深入系列第十二篇,通過new的模擬實現(xiàn),帶大家揭開使用new獲得構(gòu)造函數(shù)實例的真相 new 一句話介紹 new: new 運算符創(chuàng)建一個用戶定義的對象類型的實例或具...
摘要:深入之繼承的多種方式和優(yōu)缺點深入系列第十五篇,講解各種繼承方式和優(yōu)缺點。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點 JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點。 但是注意: 這篇文章更像是筆記,哎,再讓我...
摘要:深入系列第十四篇,講解創(chuàng)建對象的各種方式,以及優(yōu)缺點。也就是說打著構(gòu)造函數(shù)的幌子掛羊頭賣狗肉,你看創(chuàng)建的實例使用都無法指向構(gòu)造函數(shù)這樣方法可以在特殊情況下使用。 JavaScript深入系列第十四篇,講解創(chuàng)建對象的各種方式,以及優(yōu)缺點。 寫在前面 這篇文章講解創(chuàng)建對象的各種方式,以及優(yōu)缺點。 但是注意: 這篇文章更像是筆記,因為《JavaScript高級程序設(shè)計》寫得真是太好了! 1....
摘要:如下所示在規(guī)范中,已經(jīng)正式把屬性添加到規(guī)范中也可以通過設(shè)置和獲取對象的原型對象對象之間的關(guān)系可以用下圖來表示但規(guī)范主要介紹了如何利用構(gòu)造函數(shù)去構(gòu)建原型關(guān)系。 前言 在軟件工程中,代碼重用的模式極為重要,因為他們可以顯著地減少軟件開發(fā)的成本。在那些主流的基于類的語言(比如Java,C++)中都是通過繼承(extend)來實現(xiàn)代碼復(fù)用,同時類繼承引入了一套類型規(guī)范。而JavaScript是...
閱讀 2384·2021-11-23 09:51
閱讀 5854·2021-09-22 15:39
閱讀 3409·2021-09-02 15:15
閱讀 3559·2019-08-30 15:54
閱讀 2418·2019-08-30 15:53
閱讀 1459·2019-08-30 14:04
閱讀 2515·2019-08-29 18:33
閱讀 2480·2019-08-29 13:08