JavaScript之全面理解面向物件的JS
從程式碼清單 5 可以看出,基於原型的繼承方式,雖然實現了程式碼複用,但其行文鬆散且不夠流暢,可閱讀性差,不利於實現擴充套件和對原始碼進行有效地組織管理。不得不承認,類式繼承方式在語言實現上更具健壯性,且在構建可複用程式碼和組織架構程式方面具有明顯的優勢。這使得程式設計師們希望尋找到一種能夠在 JavaScript 中以類式繼承風格進行編碼的方法途徑。從抽象的角度來講,既然類式繼承和原型繼承都是為實現面向物件而設計的,並且他們各自實現的載體語言在計算能力上是等價的 ( 因為圖靈機的計算能力與 Lambda 演算的計算能力是等價的 ),那麼能不能找到一種變換,使得原型式繼承語言通過該變換實現具有類式繼承編碼的風格呢?
目前一些主流的 JS 框架都提供了這種轉換機制,也即類式宣告方法,比如 Dojo.declare()、Ext.entend() 等等。使用者使用這些框架,可以輕易而友好地組織自己的 JS 程式碼。其實,在眾多框架出現之前,JavaScript 大師 Douglas Crockford 最早利用三個函式對 Function 物件進行擴充套件,實現了這種變換,關於它的實現細節可以。此外還有由 Dean Edwards實現的著名的 Base.js。值得一提的是,jQuery 之父 John Resig 在搏眾家之長之後,用不到 30 行程式碼便實現了自己的 Simple Inheritance
清單 6. 使用 Simple Inheritance 實現類式繼承
<script> // 宣告 Person 類 var Person = Class.extend( { _issleeping: true, init: function( name ) { this._name = name; }, isSleeping: function() { return this._issleeping; } } ); // 宣告 Programmer 類,並繼承 Person var Programmer = Person.extend( { init: function( name, issleeping ) { // 呼叫父類建構函式 this._super( name ); // 設定自己的狀態 this._issleeping = issleeping; } }); var person = new Person( "張三" ); var diors = new Programmer( "張江男", false ); // 列印 true console.log( person.isSleeping() ); // 列印 false console.log( diors.isSleeping() ); // 此處全為 true,故列印 true console.log( person instanceof Person && person instanceof Class && diors instanceof Programmer && diors instanceof Person && diors instanceof Class ); </script>
如果您已對原型、函式構造器、閉包和基於上下文的 this 有了充分的理解,那麼理解 Simple Inheritance 的實現原理也並非相當困難。從本質上講,var Person = Class.extend(...)該語句中,左邊的 Person 實際上是獲得了由 Class 呼叫 extend 方法返回的一個構造器,也即一個 function 物件的引用。順著這個思路,我們繼續介紹 Simple Inheritance 是如何做到這一點,進而實現了由原型繼承方式到類式繼承方式的轉換的。圖 2 是 Simple Inheritance 的原始碼及其附帶註釋。為了方便理解,用中文對程式碼逐行補充說明。
圖 2.Simple Inheritance 原始碼解析
拋開程式碼第二部分,整體連貫地考察第一和第三部分會發現,extend 函式的根本目的就是要構造一個具有新原型屬性的新構造器。我們不禁感嘆 John Resig的大師手筆及其對 JS 語言本質把握的細膩程度。至於 John Resig是如何想到這樣精妙的實現方法,感興趣的讀者可以閱讀本文 (參考資源),其中有詳細介紹關於最初設計 Simple Inheritance 的思維過程。、
JavaScript 私有成員實現
到此為止,如果您任然對 JavaScript 面向物件持懷疑態度,那麼這個懷疑一定是,JavaScript 沒有實現面向物件中的資訊隱藏,即私有和公有。與其他類式面向物件那樣顯式地宣告私有公有成員的方式不同,JavaScript 的資訊隱藏就是靠閉包實現的。見 程式清單 7:清單 7. 使用閉包實現資訊隱藏
<script>
// 宣告 User 構造器
function User( pwd ) {
// 定義私有屬性
var password = pwd;
// 定義私有方法
function getPassword() {
// 返回了閉包中的 password
return password;
}
// 特權函式宣告,用於該物件其他公有方法能通過該特權方法訪問到私有成員
this.passwordService = function() { return getPassword(); }
}
// 公有成員宣告
User.prototype.checkPassword = function( pwd ) {
return this.passwordService() === pwd;
};
// 驗證隱藏性
var u = new User( "123456" );
// 列印 true
console.log( u.checkPassword( "123456" ) );
// 列印 undefined
console.log( u.password );
// 列印 true
console.log( typeof u.getPassword === "undefined" );
</script>
JavaScript 必須依賴閉包實現資訊隱藏,是由其函式式語言特性所決定的。本文不會對函式式語言和閉包這兩個話題展開討論,正如上文預設您理解 JavaScript 中基於上下文的 this 一樣。關於 JavaScript 中實現資訊隱藏,Douglas Crockford在《 Private members in JavaScript 》一文中有更權威和詳細的介紹。
相關推薦
JavaScript之全面理解面向物件的JS
從程式碼清單 5 可以看出,基於原型的繼承方式,雖然實現了程式碼複用,但其行文鬆散且不夠流暢,可閱讀性差,不利於實現擴充套件和對原始碼進行有效地組織管理。不得不承認,類式繼承方式在語言實現上更具健壯性,且在構建可複用程式碼和組織架構程式方面具有明顯的優勢。這使得程式設計師們希望尋找到一種能
JavaScript-理解 面向物件的程式設計
本文結構 建立物件 物件的繼承(有些不是很理解-後續會更新) 官方定義:物件是擁有屬性和方法的資料。 物件和函式比較: 函式是用來實現具體功能的程式碼,用一種方式把他們組織起來,就是函數了。
從零開始學 Web 之 JavaScript(五)面向物件
大家好,這裡是「 Daotin的夢囈 」從零開始學 Web 系列教程。此文首發於「 Daotin的夢囈 」公眾號,歡迎大家訂閱關注。在這裡我會從 Web 前端零基礎開始,一步步學習 Web 相關的知識點,期間也會分享一些好玩的專案。現在就讓我們一起進入 Web 前端學習的冒險之旅吧! 一、面向物件 1、
js -- 理解面向物件(建立物件與繼承)
目錄 二、繼承 1. 原型鏈 宣告: 部落格中關於js篇都是在node環境下測試,若在瀏覽器中有些地方結果可能有所不同但原理相同。 一、建立物件 1. 工廠函式模式 該模式抽象了建立具體物件
python基礎之簡單的面向物件
類的繼承: class Record: __Occupation='Test' def __init__(self,name,age): self.name=name self.age=age def getOccupation(self)
1-理解面向物件
java語言是純粹的面向物件的程式設計語言,主要表現為java完全支出面向物件的三種基本特徵:封裝(Encapsulation)、繼承(Inheritance)和多型(Polymorphism)。java語言以物件為中心,java程式的最小單位是類,整個java程式是由一個一個的類組成。封裝指
王志成/王之泰《面向物件程式設計(java)》第十一週學習總結
理論學習部分: JAVA的集合框架 l JAVA的集合框架實現對各種資料結構的封裝,以降低對資料管理與處理的難度。 l 所謂框架就是一個類庫的集合,框架中包含很多超類,程式設計者建立這些超類的子類可較方便的設計設計程式所需的類。例如:Swing類包 l 集合(Collection或稱為容
Java之路:面向物件與面向過程
一、結構化程式設計 早期的程式設計,大量使用共享變數(全域性變數)和goto語句,這使得程式碼結構比較混亂,不容易改錯和複用。 後來有人證明所有的有意義的程式流程都可以使用順序、選擇和迴圈來實現,並由此提出結構化程式設計。 它的主要觀點是採用自頂向下、逐步求精及模組化的程式設計方
我的Python成長之路--Day25--面向物件的三大特性介紹01(繼承和派生)
面向物件一共有三個重要的特性,分別是:繼承、多型和封裝.今天來具體介紹一下繼承相關的知識點 1.什麼是繼承? 在程式中繼承是一種新建類的方式,新建立的類稱之為子類/派生類,被繼承的類稱之為父類/基類/超類 繼承描述的是一種遺傳關係,子類可以重用父類的屬性 2.為什麼要用
Java基礎之深入理解Class物件與反射機制
深入理解Class物件 RRIT及Class物件的概念 RRIT(Run-Time Type Identification)執行時型別識別。在《Thinking in Java》一書第十四章中有提到,它的功能是在執行時識別物件的型別和類資訊。有兩種主要方式:“傳統的”RTTI(它假定我們在編譯時
python之路--初識面向物件
1. 初識面向物件 面向過程: 一切以事務的發展流程為中心. 面向物件: 一切以物件為中心. 一切皆為物件. 具體的某一個事務就是物件 打比方: 大象進冰箱 步驟: 第一步, 開門, 第二步, 裝大象, 第三步, 關門 面向物件:大象, 你進
Python之旅11:面向物件進階遍
本章內容: 面向物件三大特性(封裝、繼承、多型) 類的成員 一、面向物件三大特性 面向物件的三大特性是指:封裝、繼承和多型。 1、封裝 封裝,顧名思義就是將內容封裝到某個地方,以後再去呼叫被封裝在某處的內容。 所以,在使用面向物件的封裝特性時,需要: 將
Effective C++之繼承與面向物件設計
5.條款之避免繼承而來的名稱 int x; void someFunc() { double x; std::cin >> x; } 我們都知道上面這段程式碼會因為區域性變數的原因,輸入的x是double型別的 根據以上程式碼,我們來看看下面的類: #in
王之泰《面向物件程式設計(java)》課程學習總結
第一部分:理論知識學習部分 總複習綱要 1. Java語言特點與開發環境配置(第1章、第2章) 2. Java基本程式結構(第3章) 3. Java面向物件程式結構(第4章、第5章、第6章) 4. 類、類間關係、類圖 5. Java JDK預定義類/介面及其API(String-第3章、 Arr
JavaScript之深入理解【函式】
一 參考文獻 《JavaScript忍者祕籍》 二 函式特徵總結 1. 函式是【第一型物件(first-class object)】:可以像這門語言的其它物件一樣使用 函式可以共處, 可以將其視為其它任意型別的JavaScript
JavaScript之深入理解【函數】
計時器 卸載 擁有 普通 參數 深入理解 成對 類型 t對象 一 參考文獻 《JavaScript忍者秘籍》 二 函數特征總結 1. 函數是【第一型對象(first-class object)】:可以像這門語言的其它對象一樣使用 函數可以共處,可以將其視
python之路--17. 面向物件 -成員
三十六.面向物件的成員 能寫的所有成員 一.變數 1.例項變數 訪問時 物件.變數 2.類變數 訪問時
如何理解面向物件思想
我們學習JAVA語言必須要掌握物件和類,這樣的話就可以更深層次的理解JAVA這種面向物件的程式開發理念,從而更好更快地掌握JAVA的變成 思想和方法。掌握類和物件是JAVA語言變成的基礎。那麼
JavaScript基礎系列14---面向物件入門
一、面向物件的概念 1.1 什麼是面向過程 就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候一個一個依次呼叫就可以了。 生活中的的例子舉例。 1.2 什麼是面向物件 面向物件是把構成問題事務分
JavaScript系列之一:面向物件程式設計
JS基本介紹 JS的用途:Javascript可以實現瀏覽器端、伺服器端(nodejs)。。。 瀏覽器端JS由以下三個部分組成: ECMAScript:基礎語法(資料型別、運算子、函式。。。) BOM(瀏覽器物件模型):window、locat