摘要:高程讀書筆記第六章理解對(duì)象創(chuàng)建自定義對(duì)象的方式有創(chuàng)建一個(gè)實(shí)例,然后為它添加屬性和方法。創(chuàng)建了自定義的構(gòu)造函數(shù)之后,其原型對(duì)象默認(rèn)只會(huì)取得屬性至于其他方法都是從繼承而來(lái)的。
JS高程讀書筆記--第六章 理解對(duì)象
創(chuàng)建自定義對(duì)象的方式有創(chuàng)建一個(gè)Object實(shí)例,然后為它添加屬性和方法。還可用創(chuàng)建對(duì)象字面量的方式
屬性類型ECMAScript在定義只有內(nèi)部采用的特性時(shí),描述了屬性的各種特征。
ECMAScript中有兩種屬性:數(shù)據(jù)屬性和訪問(wèn)器屬性。在JS中不能直接訪問(wèn)它們。
數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位置。在這個(gè)位置可以讀取和寫入值。
[[Configurable]]:表示能否通過(guò)delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問(wèn)器屬性。默認(rèn)值為true;
[[Enumerable]]:表示能否通過(guò)for-in循環(huán)返回屬性。默認(rèn)值為true;
[[Writable]]:表示能否修改屬性的值。默認(rèn)值為true;
[[Value]]:包含這個(gè)屬性的數(shù)據(jù)值。讀取屬性值的時(shí)候,從這個(gè)位置讀;寫入屬性值的時(shí)候,把新值保存在這個(gè)位置。默認(rèn)值為undefined;
要修改屬性默認(rèn)的特性,必須使用ES5的Object.defineProperty()方法。這個(gè)方法接收三個(gè)參數(shù):屬性所在的對(duì)象、屬性的名字和一個(gè)描述符對(duì)象。在調(diào)用這個(gè)方法時(shí),如果不指定,configurable、enumerable和writable特性的默認(rèn)值都是false;
訪問(wèn)器屬性一旦把屬性定義為不可配置的,就不能再把它變回可配置的。
訪問(wèn)器屬性不包含數(shù)據(jù)值;他們包含一對(duì)getter和setter函數(shù)(這兩個(gè)函數(shù)都不是必須的)。在讀取訪問(wèn)器屬性時(shí),會(huì)調(diào)用getter函數(shù),這個(gè)函數(shù)負(fù)責(zé)返回有效值;在寫入訪問(wèn)器屬性時(shí),會(huì)調(diào)用setter函數(shù)并傳入新值,這個(gè)函數(shù)負(fù)責(zé)決定如何處理數(shù)據(jù)。
[[Configurable]]:表示能否通過(guò)delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為數(shù)據(jù)屬性。默認(rèn)值為true;
[[Enumerable]]:表示能否通過(guò)for-in循環(huán)返回屬性。默認(rèn)值為true;
[[Get]]:在讀取屬性時(shí)調(diào)用的函數(shù)。默認(rèn)值為undefined;
[[Set]] :在寫入屬性時(shí)調(diào)用的函數(shù)。默認(rèn)值為undefined;
訪問(wèn)器屬性不能直接定義,必須使用Object.defineProperty()來(lái)定義。
不一定非要同時(shí)指定getter和setter。只指定getter意味著屬性是不能寫,嘗試寫入屬性會(huì)被忽略。在嚴(yán)格模式下,嘗試寫入只指定了getter函數(shù)的屬性會(huì)拋出錯(cuò)誤。類似的,只指定setter函數(shù)的屬性也不能讀,否則在非嚴(yán)格模式下會(huì)返回undefined,而在嚴(yán)格模式下會(huì)拋出錯(cuò)誤。
定義多個(gè)屬性可以利用ES5定義的Object.defineProperties()方法通過(guò)描述符一次定義多個(gè)屬性。這個(gè)方法接收兩個(gè)對(duì)象參數(shù):第一個(gè)對(duì)象是要添加和修改其屬性的對(duì)象,第二個(gè)對(duì)象的屬性與第一個(gè)對(duì)象中要添加或修改的屬性一一對(duì)應(yīng)。
讀取屬性的特性使用ES5的Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符。這個(gè)方法接收兩個(gè)參數(shù):屬性所在對(duì)象和要讀取其描述符的屬性名稱,返回值是一個(gè)對(duì)象。
創(chuàng)建對(duì)象 工廠模式這種模式抽象了創(chuàng)建具體對(duì)象的過(guò)程。開(kāi)發(fā)人員發(fā)明了一種函數(shù),用函數(shù)來(lái)封裝以特定接口創(chuàng)建對(duì)象的細(xì)節(jié)。
function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ console.log(this.name); } return o; } var person1 = createPerson("junyan","25","FE");
工廠模式雖然解決了創(chuàng)建多個(gè)相似對(duì)象的問(wèn)題,但卻沒(méi)有解決對(duì)象識(shí)別的問(wèn)題(即怎樣知道一個(gè)對(duì)象的類型)
構(gòu)造函數(shù)模式可以創(chuàng)建自定義的構(gòu)造函數(shù),從而定義自定義對(duì)象類型的屬性和方法。
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ console.log(this.name); }; } var person1 = new Person("junyan","25","FE")
這種方式與工廠模式存在以下不同:
沒(méi)有顯式的創(chuàng)建對(duì)象;
直接將屬性和方法賦給了this對(duì)象;
沒(méi)有return語(yǔ)句;
要?jiǎng)?chuàng)建Person新實(shí)例,必須使用new操作符。以這種方式調(diào)用構(gòu)造函數(shù)實(shí)際上會(huì)經(jīng)歷以下4個(gè)步驟:
創(chuàng)建一個(gè)新對(duì)象;
將構(gòu)造函數(shù)的作用域賦給新對(duì)象(因此this就指向了這個(gè)新對(duì)象);
執(zhí)行構(gòu)造函數(shù)中的代碼(為這個(gè)新對(duì)象添加屬性);
返回新對(duì)象;
實(shí)例都有一個(gè)constructor(構(gòu)造函數(shù))屬性,該屬性指向Person。對(duì)象的這個(gè)屬性最初是用來(lái)標(biāo)識(shí)對(duì)象類型的。但是,提到檢測(cè)對(duì)象類型,還是instanceof操作符要更可靠一些。
將構(gòu)造函數(shù)當(dāng)做函數(shù)創(chuàng)建自定義的構(gòu)造函數(shù)意味著將來(lái)可以將它的實(shí)例標(biāo)識(shí)為一種特定的類型
構(gòu)造函數(shù)與其他函數(shù)的唯一區(qū)別,就在于調(diào)用它們的方式不同。任何函數(shù),只要通過(guò)new操作符來(lái)調(diào)用,那它就可以作為構(gòu)造函數(shù);
不使用new操作符調(diào)用,屬性和方法都被添加給window對(duì)象
構(gòu)造函數(shù)的問(wèn)題使用構(gòu)造函數(shù)的主要問(wèn)題就是每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍。
不同實(shí)例上的同名函數(shù)是不相等的,可以通過(guò)把函數(shù)定義轉(zhuǎn)移到構(gòu)造函數(shù)外部來(lái)解決。
原型模式!!我們創(chuàng)建的每個(gè)函數(shù)都有一個(gè)prototype(原型)屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,而這個(gè)對(duì)象的用途是包含可以由特定類型的所有實(shí)例共享的屬性和方法
prototype就是通過(guò)調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象
使用原型對(duì)象的好處是可以讓所有對(duì)象實(shí)例共享它所包含的屬性和方法。換句話說(shuō),不必在構(gòu)造函數(shù)中定義對(duì)象實(shí)例的信息,而是可以將這些信息直接添加到原型對(duì)象中。
理解原型對(duì)象!!!構(gòu)造函、原型和實(shí)例的關(guān)系:每個(gè)構(gòu)造函數(shù)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象(prototype),原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針(constructor),而實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針(__proto__)
只要?jiǎng)?chuàng)建了一個(gè)新函數(shù),就會(huì)根據(jù)一組特定的規(guī)則為該函數(shù)創(chuàng)建一個(gè)prototype屬性,這個(gè)屬性指向函數(shù)的原型對(duì)象。
所有原型對(duì)象都會(huì)自動(dòng)獲得一個(gè)constructor(構(gòu)造函數(shù))屬性,這個(gè)屬性包含一個(gè)指向prototype屬性所在函數(shù)的指針。例:Person.prototype.constructor = Person。
創(chuàng)建了自定義的構(gòu)造函數(shù)之后,其原型對(duì)象默認(rèn)只會(huì)取得constructor屬性;至于其他方法都是從Object繼承而來(lái)的。
原型最初只包含constructor屬性,而該屬性也是共享的,因此可以通過(guò)對(duì)象實(shí)例訪問(wèn)
當(dāng)調(diào)用構(gòu)造函數(shù)創(chuàng)建一個(gè)新實(shí)例后,該實(shí)例的內(nèi)部將包含一個(gè)指針(內(nèi)部屬性)ECMA叫[[Prototype]],指向構(gòu)造函數(shù)的原型對(duì)象,高級(jí)瀏覽器在每個(gè)對(duì)象上都支持一個(gè)屬性__proto__。
注:這個(gè)連接存在于實(shí)例與構(gòu)造函數(shù)的原型對(duì)象之間,不存在于實(shí)例與構(gòu)造函數(shù)之間。
可以通過(guò)isPrototypeOf()方法來(lái)確定對(duì)象之間是否存在這種關(guān)系
Person.prototype.isPrototypeOf(person1); // true;
ES5新增了一個(gè)方法,叫Object.getPrototypeOf(),這個(gè)方法返回[[Prototype]]的值。
Object.getPrototypeOf(person1) == Person.prototype。
使用這個(gè)方法可以方便的取得一個(gè)對(duì)象的原型;
當(dāng)為對(duì)象實(shí)例添加一個(gè)屬性時(shí),這個(gè)屬性就會(huì)屏蔽原型對(duì)象中的同名屬性;換句話說(shuō),添加這個(gè)屬性只會(huì)阻止我們?cè)L問(wèn)原型中的那個(gè)屬性,但不會(huì)修改那個(gè)屬性。即使將這個(gè)屬性設(shè)置為null,也只會(huì)在實(shí)例中設(shè)置這個(gè)屬性,而不會(huì)恢復(fù)其指向原型的鏈接。不過(guò),可以通過(guò)使用delete操作符則可以完全刪除實(shí)例屬性,從而讓我們能夠重新訪問(wèn)原型中的屬性。
原型與in操作符使用hasOwnProperty()方法可以檢測(cè)一個(gè)屬性是存在于實(shí)例中,還是存在于原型中。這個(gè)方法(從Object繼承而來(lái))只在給定屬性存在于對(duì)象實(shí)例中,在返回true。
多帶帶使用in時(shí),in操作符會(huì)在通過(guò)對(duì)象能夠訪問(wèn)給定屬性時(shí)返回true,無(wú)論該屬性存在于實(shí)例中還是原型中。
同時(shí)使用hasOwnProperty()方法和in操作符,就可以確定該屬性到底是存在于對(duì)象中,還是存在于原型中
在使用for-in循環(huán)時(shí),返回的是所有能夠通過(guò)對(duì)象訪問(wèn)的、可枚舉的屬性,其中即包括存在于實(shí)例中的屬性,也包括存在于原型中的屬性。屏蔽了原型中不可枚舉屬性的實(shí)例屬性也會(huì)在for-in循環(huán)中返回。
要取得對(duì)象上可枚舉的實(shí)例屬性,可以使用ES5的Object.keys(),這個(gè)方法接收一個(gè)對(duì)象作為參數(shù),返回一個(gè)包含所有可枚舉屬性的字符串?dāng)?shù)組。
如果想得到所有實(shí)例屬性,無(wú)論它是否可枚舉,都可以使用Object.getOwnPropertyNames()
更簡(jiǎn)單的原型語(yǔ)法可以用一個(gè)包含所有屬性和方法的對(duì)象字面量來(lái)重寫整個(gè)原型對(duì)象
Person.prototype = { name:"junyan", job:"FE" }
但是這樣constructor屬性就不再指向Person,這種語(yǔ)法實(shí)際上完全重寫了默認(rèn)的prototype對(duì)象,因此constructor屬性就變成了新對(duì)象的constructor屬性,不再指向Person,而是指向Object。此時(shí)instanceof還能返回正確的結(jié)果。
如果constructor屬性很重要,可以特意設(shè)定將它設(shè)置回適當(dāng)?shù)闹?,但這種方式重設(shè)constructor屬性會(huì)導(dǎo)致它的[[Enumerable]]特性被設(shè)置為true,因?yàn)槟J(rèn)情況下原生的constructor屬性是不可枚舉的??梢允褂肊S5的Object.defineProperty()
原型的動(dòng)態(tài)性我們對(duì)原型對(duì)象所做的任何修改都能夠立即從實(shí)例上反映出來(lái),即使是先創(chuàng)建了實(shí)例后修改原型也照樣如此,因?yàn)閷?shí)例與原型之間的連接只不過(guò)是一個(gè)指針,而非一個(gè)副本;
但是如果重寫了整個(gè)原型對(duì)象,就不一樣。調(diào)用構(gòu)造函數(shù)時(shí)會(huì)為實(shí)例添加一個(gè)指向最初原型的[[Prototye]]指針(__proto__),而把原型修改為另一個(gè)對(duì)象就等于切斷了構(gòu)造函數(shù)與最初原型之間的聯(lián)系
重寫原型對(duì)象切斷了現(xiàn)有原型與任何之前已經(jīng)存在的對(duì)象實(shí)例之間的聯(lián)系,它們引用的仍然是最初的原型
原生對(duì)象的原型實(shí)例中的指針僅指向原型,而不指向構(gòu)造函數(shù)
所有原生引用類型(Object、Array、String等)都在其構(gòu)造函數(shù)的原型上定義了方法;
通過(guò)原生對(duì)象的原型,不僅可以取得所有默認(rèn)方法的引用,而且也可以定義新方法。可以像修改自定義對(duì)象的原型一樣修改原生對(duì)象的原型,因此可以隨時(shí)添加方法。(不建議);
原型對(duì)象的問(wèn)題原型中所有屬性被實(shí)例共享,對(duì)于基本類型值的屬性,通過(guò)在實(shí)例上添加一個(gè)同名屬性,可以隱藏原型中的對(duì)應(yīng)屬性,但對(duì)于引用類型值的屬性來(lái)說(shuō),實(shí)例上修改其值,在所有其他實(shí)例中都會(huì)反映出來(lái),所以基本不多帶帶使用原型模式。
組合使用構(gòu)造函數(shù)模式和原型模式構(gòu)造函數(shù)模式用于定義實(shí)例屬性,而原型模式用于定義方法和共享屬性。
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.friends = ["xiaohua","hanghang"] } Person.prototype = { constructor:Person, sayName:function(){ console.log(this.name); } }繼承
ECMAScript只支持實(shí)現(xiàn)繼承,而且實(shí)現(xiàn)繼承主要是依靠原型鏈來(lái)實(shí)現(xiàn)。
原型鏈原型鏈作為實(shí)現(xiàn)繼承的主要方法。其基本思想是利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。
如果讓原型對(duì)象等于另一個(gè)類型的實(shí)例,此時(shí)的原型對(duì)象將包含一個(gè)指向另一個(gè)原型的指針(__proto__)相應(yīng)地,另一個(gè)原型中也包含著一個(gè)指向另一個(gè)構(gòu)造函數(shù)的指針。若另一個(gè)原型又是另一個(gè)類型的實(shí)例,上述關(guān)系依然成立,如此層層遞進(jìn),就構(gòu)成了實(shí)例與原型的鏈條。
默認(rèn)的原型在找不到屬性或方法的情況下,搜索過(guò)程總是要一環(huán)一環(huán)地前行到原型鏈末端才會(huì)停下來(lái)
所有引用類型默認(rèn)都繼承了Object,而這個(gè)繼承也是通過(guò)原型鏈實(shí)現(xiàn)的。所有函數(shù)的默認(rèn)原型都是Object實(shí)例,因此默認(rèn)原型都會(huì)包含一個(gè)內(nèi)部指針(__proto__),指向Object.prototype。這也正是所有自定義類型都會(huì)繼承toString()、valueOf()等默認(rèn)方法的根本原因
確定原型和實(shí)例的關(guān)系第一種方式是使用instanceof操作符,只要用這個(gè)操作符來(lái)測(cè)試實(shí)例與原型鏈中出現(xiàn)過(guò)的構(gòu)造函數(shù),結(jié)果就會(huì)返回true。
第二種方式是使用isPrototypeOf()方法。同樣,只要是原型鏈中出現(xiàn)過(guò)的原型,都可以說(shuō)是該原型鏈所派生的實(shí)例的原型,因此這個(gè)方法也會(huì)返回true.
謹(jǐn)慎地定義方法給原型添加方法一定要放在替換原型的語(yǔ)句之后,重寫的方法會(huì)屏蔽原來(lái)的那個(gè)方法
在通過(guò)原型鏈實(shí)現(xiàn)繼承時(shí),不能使用對(duì)象字面量創(chuàng)建原型方法。因?yàn)檫@樣做就會(huì)重寫原型鏈。
原型鏈的問(wèn)題實(shí)踐中很少會(huì)多帶帶使用原型鏈
在通過(guò)原型來(lái)實(shí)現(xiàn)繼承時(shí),原型實(shí)際上會(huì)變成另一個(gè)類型的實(shí)例,原先的實(shí)例屬性也就順理成章的變成了現(xiàn)在的原型屬性
在創(chuàng)建子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。應(yīng)該說(shuō)是沒(méi)有辦法在不影響所有對(duì)象實(shí)例的情況下,給超類型的構(gòu)造函數(shù)傳遞參數(shù)。
借用構(gòu)造函數(shù)在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型構(gòu)造函數(shù),可以通過(guò)使用apply()和call()方法在新創(chuàng)建的對(duì)象上執(zhí)行構(gòu)造函數(shù)。
function SubType(){ SuperType.call(this); }
這一年就會(huì)在新的Subtype對(duì)象上執(zhí)行SuperType()函數(shù)中定義的所有對(duì)象初始化代碼。
可以在子類型構(gòu)造函數(shù)中向超類型構(gòu)造函數(shù)傳遞參數(shù)
function SubType(){ SuperType.call(this,"junyan"); }
如果僅僅是借用構(gòu)造函數(shù),那么也將無(wú)法避免構(gòu)造函數(shù)模式存在的問(wèn)題——方法都在構(gòu)造函數(shù)中定義,因此函數(shù)復(fù)用就無(wú)從談起,而且在超類型的原型中定義的方法,對(duì)子類型而言也是不可見(jiàn)的,結(jié)果所有類型都只能使用構(gòu)造函數(shù)模式。
組合繼承有時(shí)也叫作偽經(jīng)典繼承,使用原型鏈實(shí)現(xiàn)對(duì)原型屬性和方法的繼承,而通過(guò)借用構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承。這樣既通過(guò)在原型上定義方法實(shí)現(xiàn)了函數(shù)復(fù)用,又能夠保證每個(gè)實(shí)例都有它自己的屬性。
instanceof和isPrototypeof()也能夠用于識(shí)別基于組合繼承創(chuàng)建的對(duì)象
組合繼承最大的問(wèn)題就是無(wú)論什么情況下,都會(huì)調(diào)用兩次超類型構(gòu)造函數(shù):一次是在創(chuàng)建子類原型的時(shí)候,另一次是在子類型構(gòu)造函數(shù)內(nèi)部。
原型式繼承這個(gè)方法沒(méi)有使用嚴(yán)格意義上的構(gòu)造函數(shù),是基于已有的對(duì)象創(chuàng)建新對(duì)象,同時(shí)還不必因此創(chuàng)建自定義類型。
function object(o){ function F(){} F.prototype = o; return new F(); }
嚴(yán)格上講,object()對(duì)傳入其中的對(duì)象執(zhí)行了一次淺復(fù)制
ES5通過(guò)新增Object.create()方法規(guī)范了原型式繼承。這個(gè)方法接收兩個(gè)參數(shù):一個(gè)用作新對(duì)象原型的對(duì)象和(可選的)一個(gè)為新對(duì)象定義額外屬性的對(duì)象。在傳入一個(gè)參數(shù)的情況下,Object.create()與object()方法的行為相同。
只想讓一個(gè)對(duì)象與另一個(gè)對(duì)象保持類似的情況下,原型式繼承是完全可以勝任的,不要忘了,包含引用類型值的屬性始終都會(huì)共享相應(yīng)的值,就像使用原型模式一樣。
創(chuàng)建一個(gè)僅用于封裝繼承過(guò)程的函數(shù),該函數(shù)在內(nèi)部以某種方式來(lái)增強(qiáng)對(duì)象,最后再像真地是它做了所有工作一樣返回對(duì)象。
function createAnother(original){ var clone = object(original); clone.sayHi = function(){ console.log("Hi"); }; return clone; }
在主要考慮對(duì)象而不是自定義類型和構(gòu)造函數(shù)的情況下,寄生式繼承也是一種有用的模式。任何能夠返回新對(duì)象的函數(shù)都適用于這個(gè)模式
寄生式組合繼承所謂寄生組合式繼承,即通過(guò)借用構(gòu)造函數(shù)來(lái)繼承屬性,通過(guò)原型鏈的混成形式來(lái)繼承方法。其背后的基本思路是:不必為了指定子類型的原型而調(diào)用超類型的構(gòu)造函數(shù),我們所需要的無(wú)非就是超類型原型的一個(gè)副本而已。本質(zhì)上,就是使用寄生式繼承來(lái)繼承超類型的原型,然后再將結(jié)果指定給子類型的原型
function inheritPrototype(subType,superType){ var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; }
第一步是創(chuàng)建超類型原型的一個(gè)副本
第二部是為創(chuàng)建的副本添加constructor屬性,從而彌補(bǔ)因重寫原型而失去的默認(rèn)的constructor屬性。
將新創(chuàng)建的對(duì)象(即副本)賦值給子類型的原型
這種繼承的高效率體現(xiàn)在它只調(diào)用了一次超類型構(gòu)造函數(shù),并且因此避免了在子類型.prototype上面創(chuàng)建不必要的、多余的屬性。于此同事,原型鏈還能保持不變;因此還能正常使用instanceof()和isPrototypeOf()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86446.html
摘要:創(chuàng)建一個(gè)新對(duì)象將構(gòu)造函數(shù)的作用域賦給新對(duì)象因此就指向了這個(gè)新對(duì)象執(zhí)行構(gòu)造函數(shù)中的代碼為這個(gè)新對(duì)象添加屬性返回新對(duì)象。 本章內(nèi)容 理解對(duì)象屬性 理解并創(chuàng)建對(duì)象 理解繼承 ECMA-262把對(duì)象定義為:無(wú)序?qū)傩缘募?,其屬性可以包含基本值、?duì)象或者函數(shù) 理解對(duì)象 創(chuàng)建對(duì)象 創(chuàng)建自定義對(duì)象的最簡(jiǎn)單方式就是創(chuàng)建一個(gè)Object的實(shí)例,再為它添加屬性和方法。 var person = new...
摘要:繼承的是超類型中構(gòu)造函數(shù)中的屬性,如上繼承了屬性,但沒(méi)有繼承原型中的方法。上述造成的結(jié)果是子類型實(shí)例中有兩組超類型的構(gòu)造函數(shù)中定義的屬性,一組在子類型的實(shí)例中,一組在子類型實(shí)例的原型中。 ECMAScript只支持實(shí)現(xiàn)繼承,主要依靠原型鏈來(lái)實(shí)現(xiàn)。與實(shí)現(xiàn)繼承對(duì)應(yīng)的是接口繼承,由于script中函數(shù)沒(méi)有簽名,所以無(wú)法實(shí)現(xiàn)接口繼承。 一、原型鏈 基本思想:利用原型讓一個(gè)引用類型繼承另一個(gè)引用...
摘要:高程第六章繼承理解與實(shí)踐昨日細(xì)細(xì)的讀了一遍高程現(xiàn)在寫篇文章來(lái)鞏固下認(rèn)知吧讀首先是從中讀到了什么我自己也在讀書的時(shí)候用筆記下了各個(gè)部分的點(diǎn)現(xiàn)在等于閱讀筆記回憶下書本理解基礎(chǔ)第五版中規(guī)定了兩種屬性數(shù)據(jù)屬性訪問(wèn)器屬性數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位 JavaScript高程第六章:繼承-理解與實(shí)踐昨日細(xì)細(xì)的讀了一遍JavaScript高程,現(xiàn)在寫篇文章來(lái)鞏固下認(rèn)知吧. 讀 首先是從中讀到了什么,我...
摘要:三種使用構(gòu)造函數(shù)創(chuàng)建對(duì)象的方法和的作用都是在某個(gè)特殊對(duì)象的作用域中調(diào)用函數(shù)。這種方式還支持向構(gòu)造函數(shù)傳遞參數(shù)。叫法上把函數(shù)叫做構(gòu)造函數(shù),其他無(wú)區(qū)別適用情境可以在特殊的情況下用來(lái)為對(duì)象創(chuàng)建構(gòu)造函數(shù)。 一、工廠模式 工廠模式:使用字面量和object構(gòu)造函數(shù)會(huì)有很多重復(fù)代碼,在此基礎(chǔ)上改進(jìn)showImg(https://segmentfault.com/img/bVbmKxb?w=456&...
摘要:分區(qū)函數(shù)返回一個(gè)布爾值,這意味著得到的分組的鍵類型是,于是它最多可以分為兩組是一組,是一組。當(dāng)遍歷到流中第個(gè)元素時(shí),這個(gè)函數(shù)執(zhí)行時(shí)會(huì)有兩個(gè)參數(shù)保存歸約結(jié)果的累加器已收集了流中的前個(gè)項(xiàng)目,還有第個(gè)元素本身。 一、收集器簡(jiǎn)介 把列表中的交易按貨幣分組: Map transactionsByCurrencies = transactions.stream().collect(groupi...
閱讀 2794·2023-04-25 14:41
閱讀 2397·2021-11-23 09:51
閱讀 3687·2021-11-17 17:08
閱讀 1678·2021-10-18 13:31
閱讀 5559·2021-09-22 15:27
閱讀 920·2019-08-30 15:54
閱讀 2231·2019-08-30 13:16
閱讀 739·2019-08-29 17:04