- 相關(guān)推薦
Javascript 面向對象編程
很長(cháng)一段時(shí)間以來(lái)(這里本人要幸災樂(lè )禍地說(shuō)),js是“一種點(diǎn)綴的作用,完成很有限的功能,諸如表單驗證之類(lèi),其語(yǔ)言本身也一直被當作過(guò)程化的語(yǔ)言使用,很難完成復雜的功能!。但是(這里本人要苦大仇深、痛心疾首地說(shuō)),“而Ajax的出現使得復雜腳本成為必需的組成部分,這就對 JavaScript 程序設計提出了新的要求,很多Ajax應用開(kāi)始利用JavaScript面向對象的性質(zhì)進(jìn)行開(kāi)發(fā),使邏輯更加清晰。事實(shí)上,JavaScript 提供了完善的機制來(lái)實(shí)現面向對象的開(kāi)發(fā)思想!。
這里關(guān)于對象就廢話(huà)這么多了。我們都知道面向對象編程的三個(gè)主要特點(diǎn)是:封裝、繼承和多態(tài)。下面就圍繞著(zhù)這三個(gè)特點(diǎn),記錄一些學(xué)習心得。
好的,先從封裝性開(kāi)始介紹,眾所周知,對象是封裝的最基本單位。封裝防止了程序相互依賴(lài)性而帶來(lái)的變動(dòng)影響。面向對象的封裝比傳統語(yǔ)言的封裝更為清晰、更為有力。Code is cheap.來(lái)看簡(jiǎn)單的代碼:
// 定義函數的方式定義類(lèi)
function class1() {
// 類(lèi)成員的定義及構造函數
// 這里class1 既是一個(gè)函數也是一個(gè)類(lèi)。作為函數,它可以理解為類(lèi)的構造函數, 負責初始化的工作。
}
// 使用new操作符獲得一個(gè)類(lèi)的實(shí)例
var obj = new class1();
/* 拋開(kāi)類(lèi)的概念,從代碼的形式上來(lái)看,class1 就是一個(gè)函數,那么是不是所有的函數都可以用new來(lái)操作呢?答案是肯定的。
在JavaScript 中,函數和類(lèi)就是一個(gè)概念,當new 一個(gè)函數時(shí),就會(huì )返回一個(gè)對象。如果這個(gè)函數中沒(méi)有初始化類(lèi)成員,那就會(huì )返回一個(gè)空的對象。
事實(shí)上,當new一個(gè)函數時(shí),這個(gè)函數就是所代表類(lèi)的構造函數,其中的所有代碼都可以看作為了初始化一個(gè)對象而工作。用于表示類(lèi)的函數也稱(chēng)之為構造器。
在JavaScript 中,每個(gè)對象可以看作是多個(gè)屬性(方法)的集合
*/
function test() {
alert( typeof (obj));
}
上面的代碼定義了一個(gè)類(lèi)class1,這就是js中簡(jiǎn)單的封裝,下面我們看js如何定義“靜態(tài)類(lèi)”,
function class1() { // 構造函數
}
// 靜態(tài)屬性
class1.staticProperty = " test " ;
// 靜態(tài)方法
class1.staticMethod = function () {
alert(class1.staticProperty);
}
function test() {
// 調用靜態(tài)方法
class1.staticMethod();
alert( typeof (class1));
}
接著(zhù)看“抽象類(lèi)”:
/*
在傳統面向對象語(yǔ)言中,抽象類(lèi)中的虛方法必須先被聲明,但可以在其他方法中被調用。
而在JavaScript 中,虛方法就可以看 該類(lèi)中沒(méi)有定義的方法,但已經(jīng)通過(guò)this 指針使用了。
和傳統面向對象不同的是,這里虛方法不需經(jīng)過(guò)聲明,而直接使用了。這些方法將在派生類(lèi)
中實(shí)現
*/
// 定義extend 方法
Object.extend = function (destination, source) {
for (property in source) {
destination[property] = source[property];
}
return destination;
}
Object.prototype.extend = function (object) {
return Object.extend.apply( this , [ this , object]);
}
// 定義一個(gè)抽象基類(lèi)base,無(wú)構造函數
function base() { }
base.prototype = {
initialize: function () {
this .oninit(); // 調用了一個(gè)虛方法
}
}
// 定義class1
function class1() {
// 構造函數
}
// 讓class1繼承于base 并實(shí)現其中的oninit方法
class1.prototype = ( new base()).extend({
oninit: function () { // 實(shí)現抽象基類(lèi)中的oninit 虛方法
// oninit 函數的實(shí)現
}
});
我們看到,上面“讓class1繼承于base 并實(shí)現其中的oninit方法時(shí)”,使用了“繼承”的概念,請留意。再來(lái)看一下執行的效果:
function test() {
var obj = new class1();
obj.oninit = function () { alert( " test " ); }
obj.oninit();
}
【Javascript 面向對象編程】相關(guān)文章:
2016年java面向對象編程題庫及答案10-24
javascript編程異常處理的方法08-04
javascript克隆對象深度介紹07-25
JavaScript中的三種對象10-24
JAVA面向對象的三大特性06-14
關(guān)于javascript對象之內置和對象Math的使用方法10-08
PHP面向對象重載重寫(xiě)的不同10-25