javascript物件導向程式設計的非建構函式的繼承
關於物件導向的封裝可以參閱javascript物件導向程式設計關於封裝簡單介紹一章節。
關於非建構函式的繼承可以參閱javascript物件導向程式設計的建構函式的繼承一章節。
一.什麼是"非建構函式"的繼承:
比如,現在有一個物件,叫做"中國人"。
[JavaScript] 純文字檢視 複製程式碼var Chinese = { nation:'中國' };
還有一個物件,叫做"醫生"。
[JavaScript] 純文字檢視 複製程式碼var Doctor ={ career:'醫生' }
請問怎樣才能讓"醫生"去繼承"中國人",也就是說,我怎樣才能生成一個"中國醫生"的物件?
這裡要注意,這兩個物件都是普通物件,不是建構函式,無法使用建構函式方法實現"繼承"。
二.object()方法:
json格式的發明人Douglas Crockford,提出了一個object()函式,可以做到這一點。
[JavaScript] 純文字檢視 複製程式碼function object(o) { function F() {} F.prototype = o; return new F(); }
這個object()函式,其實只做一件事,就是把子物件的prototype屬性,指向父物件,從而使得子物件與父物件連在一起。
使用的時候,第一步先在父物件的基礎上,生成子物件:
[JavaScript] 純文字檢視 複製程式碼var Doctor = object(Chinese);
然後,再加上子物件本身的屬性:
[JavaScript] 純文字檢視 複製程式碼Doctor.career = '醫生';
這時,子物件已經繼承了父物件的屬性了。
[JavaScript] 純文字檢視 複製程式碼alert(Doctor.nation); //中國
三.淺拷貝:
除了使用"prototype鏈"以外,還有另一種思路:把父物件的屬性,全部拷貝給子物件,也能實現繼承。
下面這個函式,就是在做拷貝:
[JavaScript] 純文字檢視 複製程式碼function extendCopy(p) { var c = {}; for (var i in p) { c= p; } c.uber = p; return c; }
使用的時候,這樣寫:
[JavaScript] 純文字檢視 複製程式碼var Doctor = extendCopy(Chinese); Doctor.career = '醫生'; alert(Doctor.nation); // 中國
但是,這樣的拷貝有一個問題。那就是,如果父物件的屬性等於陣列或另一個物件,那麼實際上,子物件獲得的只是一個記憶體地址,而不是真正拷貝,因此存在父物件被篡改的可能。
請看,現在給Chinese新增一個"出生地"屬性,它的值是一個陣列。
[JavaScript] 純文字檢視 複製程式碼Chinese.birthPlaces = ['北京','上海','香港'];
然後,我們為Doctor的"出生地"新增一個城市:
[JavaScript] 純文字檢視 複製程式碼Doctor.birthPlaces.push('廈門');
發生了什麼事?Chinese的"出生地"也被改掉了!
[JavaScript] 純文字檢視 複製程式碼alert(Doctor.birthPlaces); //北京, 上海, 香港, 廈門 alert(Chinese.birthPlaces); //北京, 上海, 香港, 廈門
所以,extendCopy()只是拷貝基本型別的資料,我們把這種拷貝叫做"淺拷貝"。這是早期jQuery實現繼承的方式。
四.深拷貝:
所謂"深拷貝",就是能夠實現真正意義上的陣列和物件的拷貝。它的實現並不難,只要遞迴呼叫"淺拷貝"就行了。
[JavaScript] 純文字檢視 複製程式碼function deepCopy(p, c) { var c = c || {}; for (var i in p) { if (typeof p === 'object') { c = (p.constructor === Array) ? [] : {}; deepCopy(p, c); } else { c = p; } } return c; }
使用的時候這樣寫:
[JavaScript] 純文字檢視 複製程式碼var Doctor = deepCopy(Chinese);
現在,給父物件加一個屬性,值為陣列。然後,在子物件上修改這個屬性:
[JavaScript] 純文字檢視 複製程式碼Chinese.birthPlaces = ['北京','上海','香港']; Doctor.birthPlaces.push('廈門');
這時,父物件就不會受到影響了。
[JavaScript] 純文字檢視 複製程式碼alert(Doctor.birthPlaces); //北京, 上海, 香港, 廈門 alert(Chinese.birthPlaces); //北京, 上海, 香港
目前,jQuery庫使用的就是這種繼承方法。
相關文章
- Javascript物件導向程式設計(三):非建構函式的繼承JavaScript物件程式設計函式繼承
- javascript物件導向程式設計的建構函式的繼承JavaScript物件程式設計函式繼承
- Javascript物件導向程式設計(二):建構函式的繼承JavaScript物件程式設計函式繼承
- JavaScript物件導向之二(建構函式繼承)JavaScript物件函式繼承
- JavaScript建構函式,物件導向程式設計JavaScript函式物件程式設計
- JS物件導向程式設計(二):建構函式JS物件程式設計函式
- 前端筆記之JavaScript物件導向(二)內建建構函式&相關方法|屬性|運算子&繼承&物件導向前端筆記JavaScript物件函式繼承
- javascript非建構函式繼承簡單介紹JavaScript函式繼承
- Javascript 物件導向中的建構函式和原型物件JavaScript物件函式原型
- JS物件導向程式設計(四):繼承JS物件程式設計繼承
- java-物件導向程式設計--繼承Java物件程式設計繼承
- 理解Js中物件導向程式設計的繼承JS物件程式設計繼承
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- JavaScript物件導向—繼承的實現JavaScript物件繼承
- Javascript物件導向與繼承JavaScript物件繼承
- javascript的物件導向的繼承實現JavaScript物件繼承
- ~~核心程式設計(五):物件導向——多繼承~~程式設計物件繼承
- Javascript實現物件導向繼承JavaScript物件繼承
- Golang物件導向程式設計之建構函式【struct&new】Golang物件程式設計函式Struct
- 物件導向程式設計之super內建函式的用法物件程式設計函式
- C++物件導向程式設計 類和物件提高篇 建構函式C++物件程式設計函式
- js建構函式的繼承JS函式繼承
- 繼承中的建構函式繼承函式
- Java建構函式的繼承Java函式繼承
- Day 14 匿名函式 內建函式 物件導向程式設計函式物件程式設計
- [.net 物件導向程式設計基礎] (12) 物件導向三大特性——繼承物件程式設計繼承
- javascript建構函式的繼承簡單介紹JavaScript函式繼承
- javascript物件導向繼承的簡單例項JavaScript物件繼承單例
- JavaScript之物件導向的繼承淺析2JavaScript物件繼承
- 物件導向:繼承物件繼承
- 物件導向--繼承物件繼承
- 物件導向-繼承物件繼承
- 說清楚javascript物件導向、原型、繼承JavaScript物件原型繼承
- JavaScript物件導向 ~ 原型和繼承(1)JavaScript物件原型繼承
- 《JavaScript物件導向精要》之五:繼承JavaScript物件繼承
- JavaScript物件導向那些東西-繼承JavaScript物件繼承
- 《JavaScript物件導向精要》之四:建構函式和原型物件JavaScript物件函式原型
- javascript:物件導向的程式設計JavaScript物件程式設計