摘要:面向對象的三大特性封裝繼承自己沒有的,拿別人過來用,就是繼承多態父類引用指向子類的對象中用不到創建對象的四種方式使用字面量創建對象用一個創建一個,不能復用,造成代碼冗余,資源浪費使用內置構造函數創建對象創建出來的對象都是空的對象,要手動的去
1.面向對象的三大特性
封裝
繼承
自己沒有的,拿別人過來用,就是繼承
多態
父類引用指向子類的對象(JavaScript中用不到)
使用字面量創建對象
var o = {key:value, key:value...}
用一個創建一個,不能復用,造成代碼冗余,資源浪費
使用內置構造函數創建對象
var o = new Object(); var o = new Array();
創建出來的對象都是空的對象,要手動的去為對象添加屬性。造成代碼重復
封裝簡單的工廠函數(不推薦使用)
function createObj(){ var obj = {}; obj.xx=xxx; return obj; }
自定義構造函數
function 構造函數名{ this.xxx=xxx; //.... }
1.構造函數名首字母要大寫
2.構造函數一般和new關鍵字一起使用
3.構造函數返回值默認為新創建好對象 如果手動返回基本數據類型,不影響默認返回值,如果返回的是對象,那么新創建出來的對象將不會返回,取而代之的是return后面的對象
構造函數(constructor)的執行步驟
1.使用new關鍵字創建對象
2.調用構造函數,將new創建出來的對象賦值給構造函數內的this
3.使用this給新創建出來的對象增加成員
4.默認返回新創建出來的這個對象
構造函數中的方法,每新創建一個對象的時候,該對象都會重新的創建一次這個方法,每個獨享獨占一個方法
但是該方法內容完全相同,所以造成資源浪費
1.解決辦法1
將構造函數內的方法,進行提取,放在構造函數外面,在構造函數內部進行引用賦值
那么創建出來的對象,都會指向構造函數外面的這個函數,達到共享的目的
問題:全局變量增多,造成全局變量污染,代碼結構混亂,不容易維護
2.解決辦法2
使用原型
在構造函數創建出來的時候,系統會默認的創建并關聯一個對象,這個對象就是原型,原型對象默認是空對象
默認的原型對象中會有一個屬性constructor指向該構造函數
原型對象中的成員,可以被使用和它關聯的構造函數創建出來的所有對象共享
原型對象的使用使用對象的動態特性,為原型對象添加成員
直接替換原型對象
注意事項:
直接替換原型對象,會導致替換之前創建的對象的原型和替換之后創建的對象的原型不一致原型的使用該注意事項
1.使用對象訪問屬性的時候,會現在對象中查找,如果找到了就直接使用
如果沒有找到,就去原型中查找
2.使用對象設置屬性的時候,只會在對象本身中查找,不會去原型中查找,如果在對象本身中沒有找到這個屬性
則給該對象新增一個屬性,如果在對象中有這個屬性,修改這個屬性
3.如果在原型對象中有引用類型的屬性,那么使用對象進行修改該屬性內容,則其他所有跟這個原型對象相關的對象都會受到影響
Person.prototype.car = {}; var p = new Person( ); p.car = {}; //這是修改屬性 p.car.brand= ""; //這是修改屬性的內容
4.一般情況下不會將屬性添加到原型對象中
只會將需要共享的方法,添加到原型對象中
1.這個屬性不是標準屬性,所以存在通用性問題
2.一般不推薦使用這個屬性
3.調試的時候,可以使用這個屬性
4.這個屬性是原型中的屬性
替換原型時候的注意事項:
在新替換的原型中,沒有constructor屬性,會影響三角結構關系的合理性
so,在新替換的原型中,手動添加constructor屬性,以保證關系的合理性,賦值為關聯的構造函數
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94078.html
摘要:面向對象的三大特性封裝繼承自己沒有的,拿別人過來用,就是繼承多態父類引用指向子類的對象中用不到創建對象的四種方式使用字面量創建對象用一個創建一個,不能復用,造成代碼冗余,資源浪費使用內置構造函數創建對象創建出來的對象都是空的對象,要手動的去 1.面向對象的三大特性 封裝 繼承自己沒有的,拿別人過來用,就是繼承 多態父類引用指向子類的對象(JavaScript中用不到) 2.創建對象...
摘要:創建對象對象繼承實際上是一回事我們所需要的實例對象通過構造函數獲得私有屬性通過原型鏈獲得共享的屬性。原型式繼承和寄生式繼承用于創建與已有對象類似的實例對象。 本文約定:不特殊聲明的情況下,屬性代指屬性或方法。 創建對象、對象繼承實際上是一回事:我們所需要的實例對象通過構造函數獲得私有屬性、通過原型鏈獲得共享的屬性。什么是好的方式?私有屬性通過構造函數的方式獲得(不考慮實例中自定義私有屬...
摘要:繼承方式父類構造函數實例方法子類調用實現父類的構造函數吹呀吹呀,我的驕傲放縱 js構造函數 *前言:上篇文章介紹了js中通過構造函數來實例化對象的各種方法js構造函數,這篇文章主要介紹構造函數的繼承(類的繼承),同樣包括 ES5 和 ES6 兩部分的介紹,能力所限,文中難免有不合理或錯誤的地方,還望各位大神批評指正~ 原型 首先簡單介紹一下實例屬性/方法 和 原型屬性/方法,以便更好理...
摘要:執行行代碼,我們可以看到控制臺打印出來的結果如下結果印證了我們上面講的內容指向的構造函數指向的原型對象原型對象中指向構造函數。 在javascript中原型和原型鏈機制是最難懂的部分(沒有之一),同時也是最重要的部分,在學習的過程中你可能認認真真的看了一遍但還是完全不懂書上說的什么,的確是這樣的,我在學習的時候可是反復看了4、5遍才初步理解了。 下面我把我的理解總結了一下希望對你們有...
摘要:在創建子類實例時,不能向超類型的構造函數中傳遞參數。構造函數繼承子類傳進的值是基本思想是在子類構造函數的內部調用超類或父類型構造函數。繼承保證構造函數指針指向如果想同時繼承多個,還可使用添加屬性的方式類繼承, OOP:Object Oriented Programming 面向對象編程。 題外話:面向對象的范圍實在太大,先把這些大的東西理解理解。 1.什么是對象? 根據高程和權威指南上...
閱讀 2826·2021-11-25 09:43
閱讀 978·2021-10-11 10:57
閱讀 2477·2020-12-03 17:20
閱讀 3716·2019-08-30 14:05
閱讀 2422·2019-08-29 14:00
閱讀 1991·2019-08-29 12:37
閱讀 1661·2019-08-26 11:34
閱讀 3201·2019-08-26 10:27