摘要:構(gòu)造函數(shù)模式通過構(gòu)造函數(shù)創(chuàng)建的對象可以通過標(biāo)識對象類型,通過檢測對象類型。實際上,應(yīng)該說是沒有辦法在不影響所有對象實例的情況下,給超類型的構(gòu)造函數(shù)傳遞參數(shù)。
==什么是對象?==
就是無序屬性的集合,通過屬性或者方法名與值的一一映射。
==對象的屬性類型==
對象中還定義了一些js中不能直接訪問的屬性,是為了實現(xiàn)js引擎用的。有數(shù)據(jù)屬性和訪問器屬性兩種。
1.數(shù)據(jù)屬性
數(shù)據(jù)屬性包含一個數(shù)據(jù)值的位置。在這個位置可以讀取和寫入值。數(shù)據(jù)屬性有 4 個描述其行為的
特性。
把新值保存在這個位置。這個特性的默認(rèn)值為 undefined。
要修改屬性默認(rèn)的特性,必須使用 ECMAScript 5 的 Object.defineProperty()方法。
注意:
1》 configurable 設(shè)置為 false,表示不能從對象中刪除屬性。如果對這個屬性調(diào)用 delete,則 在非嚴(yán)格模式下什么也不會發(fā)生,而在嚴(yán)格模式下會導(dǎo)致錯誤。而且,一旦把屬性定義為不可配置的, 就不能再把它變回可配置。
2》在調(diào)用 Object.defineProperty()方法時,如果不指定,configurable、enumerable 和 writable 特性的默認(rèn)值都是 false。
2.訪問器屬性
訪問器屬性不包含數(shù)據(jù)值;包含一對兒 getter 和 setter 函數(shù)(不過,這兩個函數(shù)都不是必需的)。 在讀取訪問器屬性時,會調(diào)用 getter 函數(shù),這個函數(shù)負(fù)責(zé)返回有效的值;在寫入訪問器屬性時,會調(diào)用 setter 函數(shù)并傳入新值,這個函數(shù)負(fù)責(zé)決定如何處理數(shù)據(jù)。訪問器屬性有如下 4 個特性。
? [[Get]]:在讀取屬性時調(diào)用的函數(shù)。默認(rèn)值為 undefined。
? [[Set]]:在寫入屬性時調(diào)用的函數(shù)。默認(rèn)值為 undefined。
訪問器屬性不能直接定義,必須使用 Object.defineProperty()來定義。
可以通過Object.definePro- perties()定義多個屬性;
使用 ECMAScript 5 的 Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符。
==創(chuàng)建對象的方式==
通過字面量的方式可以創(chuàng)建對象,但是創(chuàng)建有類似屬性的對象時會產(chǎn)生大量重復(fù)代碼。
1.工廠模式
用函數(shù)來封裝以特定接口創(chuàng)建對象。
缺點就是無法知道一個對象的類型。
2.構(gòu)造函數(shù)模式
通過構(gòu)造函數(shù)創(chuàng)建的對象可以通過constructor標(biāo)識對象類型,通過instanceof檢測對象類型。
構(gòu)造函數(shù)模式與工廠模式對比:
1》沒有顯式地創(chuàng)建對象;
2》直接將屬性和方法賦給了 this 對象;
3》 沒有 return 語句。
通過new操作符調(diào)用構(gòu)造函數(shù)會經(jīng)歷4個步驟:
(1) 創(chuàng)建一個新對象;
(2) 將構(gòu)造函數(shù)的作用域賦給新對象(因此 this 就指向了這個新對象);
(3) 執(zhí)行構(gòu)造函數(shù)中的代碼(為這個新對象添加屬性);
(4) 返回新對象。
構(gòu)造函數(shù)也可作為普通函數(shù)調(diào)用
Person("Greg", 27, "Doctor"); // 添加到window window.sayName(); //"Greg"
也可以在另一個對象的作用域中調(diào)用
var o = new Object();
Person.call(o, "Kristen", 25, "Nurse"); o.sayName(); //"Kristen"
構(gòu)造函數(shù)模式的缺點就是每個方法都要在每個實例上重新創(chuàng)建一遍。
function Person(name, age, job){
this.name = name; this.age = age; this.job = job; this.sayName = new Function("alert(this.name)"); // 與聲明函數(shù)在邏輯上是等價的
}
alert(person1.sayName == person2.sayName); //false
3.原型模式
通過prototype為對象添加屬性和方法。這樣實例就能共享原型的屬性和方法。
1》原型具有動態(tài)性。在實例化后定義的原型方法,實例也能調(diào)用。
2》原型的簡單寫法。
可以將原型簡寫如上,但是這種寫法實際上是重新寫了原型,新原型的constructor已經(jīng)改變,指向object。所以可以重新設(shè)置constructor。
而且如果在實例化后重寫原型,則已經(jīng)實例的對象依舊訪問原來原型對象,不能訪問新原型的方法和屬性。
組合使用構(gòu)造函數(shù)模式和原型模式
===繼承===
繼承:利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。
1.原型鏈繼承
包含引用類型值的原型屬性會被所有實例共享;而 這也正是為什么要在構(gòu)造函數(shù)中,而不是在原型對象中定義屬性的原因。在通過原型來實現(xiàn)繼承時,原型實際上會變成另一個類型的實例。于是,原先的實例屬性也就順理成章地變成了現(xiàn)在的原型屬性了。
原型鏈的問題是:由于原型中包含引用類型值所帶來的問題。和在創(chuàng)建子類型的實例時,不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。實際上,應(yīng)該說是沒有辦法在不影響所有對象實例的情況下,給超類型的構(gòu)造函數(shù)傳遞參數(shù)。實踐中很少會多帶帶使用原型鏈。
2.構(gòu)造函數(shù)繼承
借用構(gòu)造函數(shù):別忘了,函數(shù)只不過是在特定環(huán)境中執(zhí)行代碼的對象, 因此通過使用 apply()和 call()方法也可以在(將來)新創(chuàng)建的對象上執(zhí)行構(gòu)造函數(shù)。
借用構(gòu)造函數(shù)的問題
如果僅僅是借用構(gòu)造函數(shù),那么也將無法避免構(gòu)造函數(shù)模式存在的問題——方法都在構(gòu)造函數(shù)中定 義,因此函數(shù)復(fù)用就無從談起了。而且,在超類型的原型中定義的方法,對子類型而言也是不可見的,結(jié) 果所有類型都只能使用構(gòu)造函數(shù)模式。考慮到這些問題,借用構(gòu)造函數(shù)的技術(shù)也是很少多帶帶使用的。
組合繼承
組合繼承避免了原型鏈和借用構(gòu)造函數(shù)的缺陷,融合了它們的優(yōu)點,成為 JavaScript 中最常用的繼 承模式。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105307.html
摘要:面向過程函數(shù)式編程面向?qū)ο缶幊痰诙€并不是大家理解的那樣,我們先說舉個現(xiàn)實例子就明白了。多說一句函數(shù)是編程是非常強大也是我最喜歡的,以后再說,我們先說面向?qū)ο缶幊獭? 概述 當(dāng)大家已經(jīng)把js的語言基礎(chǔ)理解了,然后能夠?qū)懗鲆恍┖唵蔚睦恿?,這個時候基本上達(dá)到了一年工作經(jīng)驗的水平,而自己能夠獨立的寫一些小功能,完成一些小效果,或者臨摹修改一些比較復(fù)雜的插件的時候差不多就是兩年工作經(jīng)驗的水平,...
摘要:構(gòu)造函數(shù)對象初始化的瞬間被調(diào)用的方法。接下來看下自己做的一個小例子面向?qū)ο缶幊檀蠹液眠@是一輛它的顏色是它的內(nèi)飾是牧馬人越野車綠色的簡約精致的法拉利跑車紅色的豪華舒暢的效果圖注構(gòu)造函數(shù)始終都應(yīng)該以一個大寫字母開頭。 js的面向?qū)ο缶幊痰睦斫?面向?qū)ο蟮恼Z言有一個標(biāo)志,即擁有類的概念,抽象實例對象的公共屬性與方法,基于類可以創(chuàng)建任意多個實例對象,一般具有封裝、繼承、多態(tài)的特性!但JS中對象...
摘要:一面向?qū)ο缶幊毯喗槎x,簡稱,是一種程序設(shè)計思想。好處維護(hù)簡單模塊化是面向?qū)ο缶幊讨械囊粋€特征??蓴U(kuò)充性面向?qū)ο缶幊虖谋举|(zhì)上支持?jǐn)U充性。 一、面向?qū)ο缶幊毯喗?1.定義: Object Oriented Programming,簡稱OOP,是一種程序設(shè)計思想。OOP把對象作為程序的基本單元,一個對象包含了數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)。 2.好處: (1)、維護(hù)簡單:模塊化是面向?qū)ο缶幊讨械囊粋€...
摘要:一面向?qū)ο缶幊堂嫦驅(qū)ο缶幊淌且环N抽象方式創(chuàng)建模型的編程方式。繼承我們實現(xiàn)一個子類,繼承汽車類將類的屬性和方法賦值給繼承汽車類的原型鏈創(chuàng)建子類實例以上是中的面向?qū)ο缶幊痰暮唵谓榻B,如有錯誤,歡迎指出。 一.面向?qū)ο缶幊堂嫦驅(qū)ο缶幊?OOP--Object Oriented Programming)是一種抽象方式創(chuàng)建模型的編程方式。繼承,封裝,多態(tài)是OOP的三大基本特征。許多主流編程語言都...
閱讀 1275·2023-04-26 01:38
閱讀 1472·2021-11-15 11:39
閱讀 3263·2021-09-22 15:43
閱讀 2659·2019-08-30 15:55
閱讀 2059·2019-08-30 14:17
閱讀 2861·2019-08-29 14:16
閱讀 3071·2019-08-26 18:36
閱讀 2616·2019-08-26 12:19