Javascript 面向對象編程

來源:文萃谷 1.26W

很長一段時間以來(這裏本人要幸災樂禍地説),js是“一種點綴的作用,完成很有限的功能,諸如表單驗證之類,其語言本身也一直被當作過程化的語言使用,很難完成複雜的功能。”。但是(這裏本人要苦大仇深、痛心疾首地説),“而Ajax的出現使得複雜腳本成為必需的組成部分,這就對 JavaScript 程序設計提出了新的要求,很多Ajax應用開始利用JavaScript面向對象的性質進行開發,使邏輯更加清晰。事實上,JavaScript 提供了完善的機制來實現面向對象的開發思想。”。

Javascript 面向對象編程

這裏關於對象就廢話這麼多了。我們都知道面向對象編程的`三個主要特點是:封裝、繼承和多態。下面就圍繞着這三個特點,記錄一些學習心得。

好的,先從封裝性開始介紹,眾所周知,對象是封裝的最基本單位。封裝防止了程序相互依賴性而帶來的變動影響。面向對象的封裝比傳統語言的封裝更為清晰、更為有力。Code is cheap.來看簡單的代碼:

// 定義函數的方式定義類

function class1() {

// 類成員的定義及構造函數

// 這裏class1 既是一個函數也是一個類。作為函數,它可以理解為類的構造函數, 負責初始化的工作。

}

// 使用new操作符獲得一個類的實例

var obj = new class1();

/* 拋開類的概念,從代碼的形式上來看,class1 就是一個函數,那麼是不是所有的函數都可以用new來操作呢?答案是肯定的。

在JavaScript 中,函數和類就是一個概念,當new 一個函數時,就會返回一個對象。如果這個函數中沒有初始化類成員,那就會返回一個空的對象。

事實上,當new一個函數時,這個函數就是所代表類的構造函數,其中的所有代碼都可以看作為了初始化一個對象而工作。用於表示類的函數也稱之為構造器。

在JavaScript 中,每個對象可以看作是多個屬性(方法)的集合

*/

function test() {

alert( typeof (obj));

}

上面的代碼定義了一個類class1,這就是js中簡單的封裝,下面我們看js如何定義“靜態類”,

function class1() { // 構造函數

}

// 靜態屬性

icProperty = " test " ;

// 靜態方法

icMethod = function () {

alert(icProperty);

}

function test() {

// 調用靜態方法

icMethod();

alert( typeof (class1));

}

接着看“抽象類”:

/*

在傳統面嚮對象語言中,抽象類中的虛方法必須先被聲明,但可以在其他方法中被調用。

而在JavaScript 中,虛方法就可以看 該類中沒有定義的方法,但已經通過this 指針使用了。

和傳統面向對象不同的是,這裏虛方法不需經過聲明,而直接使用了。這些方法將在派生類

中實現

*/

// 定義extend 方法

nd = function (destination, source) {

for (property in source) {

destination[property] = source[property];

}

return destination;

}

nd = function (object) {

return y( this , [ this , object]);

}

// 定義一個抽象基類base,無構造函數

function base() { }

otype = {

initialize: function () {

this it(); // 調用了一個虛方法

}

}

// 定義class1

function class1() {

// 構造函數

}

// 讓class1繼承於base 並實現其中的oninit方法

otype = ( new base())nd({

oninit: function () { // 實現抽象基類中的oninit 虛方法

// oninit 函數的實現

}

});

我們看到,上面“讓class1繼承於base 並實現其中的oninit方法時”,使用了“繼承”的概念,請留意。再來看一下執行的效果:

function test() {

var obj = new class1();

it = function () { alert( " test " ); }

it();

}

熱門標籤