卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

es6中symbol類型的應(yīng)用 如何理解JavaScript的原型和原型鏈?

如何理解JavaScript的原型和原型鏈?JavaScript中的原型和原型鏈都是實(shí)現(xiàn)OOP的手段。OOP在JavaScript中的具體實(shí)現(xiàn)如下:對(duì)象是屬性的集合。特別地,其值是函數(shù)的屬性是方法。相

如何理解JavaScript的原型和原型鏈?

JavaScript中的原型和原型鏈都是實(shí)現(xiàn)OOP的手段。OOP在JavaScript中的具體實(shí)現(xiàn)如下:

對(duì)象是屬性的集合。特別地,其值是函數(shù)的屬性是方法。相似對(duì)象的公共屬性被提取并聚集在一起形成一個(gè)類,這些對(duì)象被稱為該類的實(shí)例。同樣,相似類的共同屬性被提取出來,聚集在一起形成一個(gè)新的類。這個(gè)類是前面幾個(gè)類的超類,前面幾個(gè)類是這個(gè)類的子類。多個(gè)超類也可以作為子類來聚集一個(gè)新的超類,這個(gè)過程會(huì)一直持續(xù)下去,直到出現(xiàn)一個(gè)名為Object的類,并且它的超類為Null。

類不僅是公共屬性的集合,還是對(duì)象工廠。類的實(shí)例對(duì)象是由該類的構(gòu)造函數(shù)創(chuàng)建的。構(gòu)造函數(shù)負(fù)責(zé)兩件事:

創(chuàng)建一個(gè)對(duì)象;

初始化對(duì)象;

因?yàn)榉椒ㄒ呀?jīng)提供了前者的實(shí)現(xiàn),所以構(gòu)造函數(shù)真正需要做的是初始化對(duì)象,這分為兩件事:

讓對(duì)象具有由類收集的公共屬性;

根據(jù)參數(shù),一些對(duì)象的屬性被特殊化;

對(duì)于第二件事,沒什么好說的,就是給要初始化的對(duì)象添加專門的屬性。對(duì)于第一件事,你也可以模仿后一種實(shí)現(xiàn)方法,但這并不是一個(gè)明智的選擇,因?yàn)檫@些公共屬性的值在大多數(shù)情況下是不會(huì)改變的。JavaScript選擇方法是:

將這些公共屬性作為屬性,并賦予它們默認(rèn)的屬性值,創(chuàng)建一個(gè)原型對(duì)象;

初始化時(shí),原型對(duì)象被賦予要初始化的對(duì)象的特殊屬性:_ _ proto _ _

也就是說,一個(gè)類對(duì)應(yīng)一個(gè)原型對(duì)象,初始化時(shí)用_ _ proto _ _連接實(shí)例對(duì)象和原型對(duì)象。

特殊屬性__proto__不僅負(fù)責(zé)連接實(shí)例和原型,還負(fù)責(zé)連接子類和超類的原型對(duì)象,實(shí)現(xiàn)類之間的繼承關(guān)系。這樣,一個(gè)對(duì)象 s類原型,超類原型,超類原型,...連接成一個(gè) "鏈條 "通過__proto__,稱為對(duì)象的原型鏈。是的,一個(gè)對(duì)象的__proto__屬性為null,說明這個(gè)對(duì)象沒有原型鏈,Object類的原型是這樣的。

為了實(shí)現(xiàn)通過原型初始化實(shí)例的方法,需要在訪問對(duì)象的屬性時(shí)相互協(xié)作:

讀取屬性值:首先在對(duì)象中查找屬性,如果存在則返回其值。號(hào)碼然后在prototype對(duì)象中搜索,如果存在則返回其值,否則在prototype對(duì)象的prototype對(duì)象中搜索,直到prototype鏈為空,表示屬性未定義,返回undefined;

給屬性賦值:找到對(duì)象中的屬性,如果存在就給它賦值,如果不存在就在對(duì)象中創(chuàng)建屬性并給它賦值;

刪除屬性:如果屬性存在于對(duì)象中,刪除它,否則不做任何事情。

這種訪問機(jī)制保證了對(duì)象屬性可以覆蓋(揭開)原型屬性,但不會(huì)改變原型屬性,這就是OOP的多態(tài)性。

構(gòu)造函數(shù)在創(chuàng)建對(duì)象時(shí)需要使用prototype對(duì)象,通過prototype屬性知道其對(duì)應(yīng)類的prototype對(duì)象。此外,為了讓實(shí)例對(duì)象知道誰創(chuàng)建了它,它的構(gòu)造函數(shù)屬性 "抓取 "構(gòu)造函數(shù)。類的原型對(duì)象也被認(rèn)為是由該類的構(gòu)造函數(shù)創(chuàng)建的。

接下來,讓我們 讓我們看看實(shí)現(xiàn)OOP的具體代碼:

首先,不考慮繼承關(guān)系,聲明類的示例代碼如下:

注意:應(yīng)該避免直接使用特殊屬性__proto__。正式的是調(diào)用方法,方法的參數(shù)是要?jiǎng)?chuàng)建的對(duì)象的原型對(duì)象。注意:按照OOP語言的傳統(tǒng),構(gòu)造函數(shù)的名字就是類的名字。

當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),如果這個(gè)上下文被綁定到一個(gè)普通的對(duì)象(而不是空的或者全局的對(duì)象窗口),這個(gè)函數(shù)被作為對(duì)象的方法調(diào)用。

當(dāng)我們用一個(gè)新的表達(dá)式創(chuàng)建一個(gè)對(duì)象時(shí),構(gòu)造函數(shù)被new以方法的形式調(diào)用:

在上面的示例代碼中,構(gòu)造函數(shù)在開頭和結(jié)尾所做的事情,新的表達(dá)式,為我們做了:

New會(huì)創(chuàng)建一個(gè)空白對(duì)象,使其原型鏈綁定構(gòu)造函數(shù)的原型屬性,使其構(gòu)造函數(shù)屬性綁定構(gòu)造函數(shù);然后用這個(gè)對(duì)象作為這個(gè)上下文調(diào)用構(gòu)造函數(shù),如果構(gòu)造函數(shù)不返回值,就把空白對(duì)象作為創(chuàng)建的對(duì)象。用代碼寫的是:

new調(diào)用的構(gòu)造函數(shù)已經(jīng)轉(zhuǎn)化為構(gòu)造函數(shù),但為了保持其構(gòu)造函數(shù)能力,一般實(shí)現(xiàn)如下:

接下來,考慮類的繼承。

實(shí)例對(duì)象的初始化過程是:先被超類的構(gòu)造函數(shù)初始化,再被子類的構(gòu)造函數(shù)初始化,以滿足子類覆蓋超類的要求?;诖?,示例代碼如下:

寫到這里,我們發(fā)現(xiàn)是一堆標(biāo)準(zhǔn)代碼不得不寫。所以早期很多前端框架陸續(xù)提供了上述代碼的封裝方案,但是一直沒有統(tǒng)一的解決方案,直到ES6直接提供了類語法,整個(gè)事情才告一段落:注意:JavaScript中的屬性分為存儲(chǔ)屬性和訪問屬性(分別對(duì)應(yīng)傳統(tǒng)OOP語言中的字段和屬性)。只有原型中的方法和訪問屬性可以在類中聲明,但舊的方法是在原型中聲明存儲(chǔ)屬性。

類表達(dá)只是語法層面的封裝,最終還是基于原型和原型鏈。

雖然我們不。;現(xiàn)在不需要根據(jù)那套復(fù)雜的規(guī)范來聲明類,理解原型和原型鏈,深入理解JavaScript的OOP機(jī)制仍然非常重要。

最后給出JavaScript內(nèi)置對(duì)象之間的原型鏈圖(粗箭頭為__proto__屬性,細(xì)箭頭為原型屬性,虛箭頭為構(gòu)造器屬性):

(Valu:數(shù)、字符串、布爾型;符號(hào)、Contain:陣列、集合、地圖)

javascript的基本數(shù)據(jù)類型有具體哪幾種?

兩個(gè)有爭議的問題是對(duì)象和功能。

個(gè)人認(rèn)為JavaScript的數(shù)據(jù)類型可以分為兩類:基本(原始)類型,引用類型;

基本類型分為以下六類:(增加了ES6,文章后面有對(duì)新類型的解釋),其中undefined表示變量不賦值;Null表示該變量尚不存在。引用類是對(duì)象(包括對(duì)象、數(shù)組和函數(shù)),函數(shù)是所有函數(shù)對(duì)象的基礎(chǔ),對(duì)象是所有對(duì)象的基礎(chǔ);函數(shù)是最容易上手但也是最難掌握的!