中文字幕二区_国产精品免费在线观看_黄色网站观看_人人草人人澡_日本真实娇小xxxx

您的位置: 首頁 > 技術(shù)文檔 > 網(wǎng)頁制作 > 面向?qū)ο蟮?Javascript
JavaScript 的事件冒泡 demo  回到列表 現(xiàn)代 javscript 編程
 面向?qū)ο蟮?Javascript

作者:mozart0 時(shí)間: 2007-04-09 文檔類型:翻譯 來自:藍(lán)色理想

第 1 頁 摘要
第 2 頁 語言特性:引用
第 3 頁 語言特性:函數(shù)重載和類型檢查
第 4 頁 語言特性:作用域
第 5 頁 語言特性:閉包
第 6 頁 語言特性:上下文
第 7 頁 面向?qū)ο蠡A(chǔ)

面向?qū)ο蠡A(chǔ)

  "面向?qū)ο蟮腏avaScript"這一說法多少有些冗余,因?yàn)镴avaScript語言本就是完全面向?qū)ο蟮模豢赡苡辛硗獾挠梅。但是,初學(xué)編程者(包括JavaScript編程者)共有的一個(gè)缺點(diǎn)就是,功能性地編寫代碼而不使用任何上下文或分組。要完全理解怎么編寫優(yōu)化的JavaScript代碼,你必須理解JavaScript的對(duì)象是怎樣工作的,它們與其它語言有怎樣的不同,以及怎樣讓它們?yōu)槟闼谩?br>  本章的剩余部分我們將討論用JavaScript編寫面向?qū)ο蟠a的基礎(chǔ),在后面的幾章中,我們將看到以這種方式編寫代碼的實(shí)例。

  對(duì)象

  對(duì)象是JavaScript的基礎(chǔ)。實(shí)際上JavaScript語言中的一切都是對(duì)象,JavaScript的多數(shù)能力也正起源于此。在其最根本的層面上,對(duì)象作為屬性的集合存在,差不多類似于你在其它語言中看到的哈希的概念。程序2-19展示了創(chuàng)建兩個(gè)帶有一組屬性的對(duì)象的基本示例。

  程序2-19. 創(chuàng)建簡(jiǎn)單對(duì)象并設(shè)置其屬性的兩個(gè)例子

//創(chuàng)建一個(gè)新對(duì)象并將其存放在obj里
var obj = new Object();

//將該對(duì)象的一些屬性設(shè)置成不同的值
obj.val = 5;
obj.click = function(){
    alert( "hello" );
};

//下面是等效的代碼,使用了{(lán)...}式縮寫,
//和定義對(duì)象屬性的"名稱-值"對(duì)
var obj = {

    //用名稱-值對(duì)設(shè)置對(duì)象屬性
    val: 5,
    click: function(){
        alert( "hello" );
    }
};

  實(shí)際上對(duì)象就這么回事了。然而,事情變得麻煩的地方,在于新對(duì)象(尤其是那些繼承其它對(duì)象屬性的對(duì)象)的創(chuàng)建。

  對(duì)象創(chuàng)建

  不像大多數(shù)其它面向?qū)ο蟮恼Z言,JavaScript實(shí)際上并沒有類的概念。在大多數(shù)其它的面向?qū)ο笳Z言中,你可以初始化一個(gè)特定的類的實(shí)例,但是在JavaScript中的情況這是這樣。在JavaScript中,對(duì)象能夠創(chuàng)建新的對(duì)象,對(duì)象可以從繼承自其它對(duì)象。整個(gè)概念被稱為"prototypal inheritance"(原型標(biāo)本繼承),將在"公有方法"一節(jié)中有更多論述。
  然而,重要的是,不論JavaScript采用哪種對(duì)象方案,總歸要有一個(gè)方式來創(chuàng)建新的對(duì)象。JavaScript的做法是,任何一個(gè)函數(shù)也都能作為一個(gè)對(duì)象被實(shí)例化。實(shí)際上,事情聽起來遠(yuǎn)比它本身更令人困惑。好比有一塊生面團(tuán)(相當(dāng)于原始的對(duì)象),用小甜餅切割器(相當(dāng)于對(duì)象構(gòu)造器,使用對(duì)象的原型prototype)為其成形。
  讓我們看看程序2-20中這一機(jī)制的工作的實(shí)例

  程序2-20. 創(chuàng)建并使用一個(gè)簡(jiǎn)單的對(duì)象

//一個(gè)簡(jiǎn)單的函數(shù),接受一個(gè)參數(shù)name,
//并將其保存于當(dāng)前上下文中
function User( name ) {
    this.name = name;
}

//用指定的name創(chuàng)建上述函數(shù)的新實(shí)例
var me = new User( "My Name" );

//我們可以看到name已經(jīng)被成為對(duì)象本身的屬性
alert( me.name == "My Name" );

//而且它確實(shí)是User對(duì)象的一個(gè)新實(shí)例
alert( me.constructor == User );

//那么,既然User()只是一個(gè)函數(shù),
//當(dāng)我們這么處理它的時(shí)候,發(fā)生了什么?
User( "Test" );

//因?yàn)閠his上下文沒有被設(shè)置,它缺省地指向全局的window對(duì)象,
//這意味著window.name將等于我們提供給它的那個(gè)name
alert( window.name == "Test" );

  程序2-20說明了constructor屬性的使用。這個(gè)存在于每一個(gè)對(duì)象中的屬性將總是指向創(chuàng)建該對(duì)象的那個(gè)函數(shù)。于是,你可以方便的復(fù)制該對(duì)象,創(chuàng)建一個(gè)新的有共同基類和不同屬性的對(duì)象。示例見程序2-21.

  程序2-21. 使用constructor屬性一例

//創(chuàng)建一個(gè)新的、簡(jiǎn)單的User對(duì)象(函數(shù))
function User() {}

//創(chuàng)建一個(gè)新的User對(duì)象
var me = new User();

//也是創(chuàng)建一個(gè)新的User對(duì)象(使用上前一個(gè)對(duì)象的constructor)
var you = new me.constructor();

//我們可以看到,實(shí)際上它們的constructor是同一個(gè)
alert( me.constructor == you.constructor );

  公有方法

  公有方法可以完全地被對(duì)象的上下文中的最終使用者訪問。為了實(shí)現(xiàn)這些對(duì)于特定對(duì)象的所有實(shí)例都可用的公共方法,你需要學(xué)習(xí)一個(gè)名為"prototype"的屬性。prototype簡(jiǎn)單地包含一個(gè)對(duì)象,為一個(gè)父對(duì)象的所有新副本充當(dāng)對(duì)基類的引用。本質(zhì)上,prototype的任何屬性對(duì)該對(duì)象的所每一個(gè)實(shí)例都是可用的。創(chuàng)建/引用的過程給了我們一個(gè)廉價(jià)版的繼承,這一點(diǎn)我將在第三章論及。
  由于對(duì)象的prototype也是一個(gè)對(duì)象,就跟其它任何對(duì)象一樣,你可以給它附加新的屬性。附加給prototype的新的屬性將成為從原來的prototype對(duì)象實(shí)例化的每個(gè)對(duì)象的一部分,有效地使得該屬性成為公有的(且可為全部實(shí)例所訪問)。程序2-22展示一個(gè)此類例子:
  
  程序2-22. 帶有通過prototype附加的方法的對(duì)象的例子

//創(chuàng)建一個(gè)新的User的構(gòu)造器
function User( name, age ){
    this.name = name;
    this.age = age;
}

//為prototype對(duì)象添加一個(gè)新方法
User.prototype.getName = function(){
    return this.name;
};

//為prototype對(duì)象添加另一個(gè)方法
//注意此方法的上下文將是被實(shí)例化的對(duì)象
User.prototype.getAge = function(){
    return this.age;
};

//實(shí)例化一個(gè)新的User對(duì)象
var user = new User( "Bob", 44 );

//我們可以看到兩個(gè)方法被附加到了對(duì)象上,有著正確的上下文
alert( user.getName() == "Bob" );
alert( user.getAge() == 44 );

  私有方法

  私有方法和變量只能被其它的私有方法、私有變量的特權(quán)方法(下一節(jié)將會(huì)論述)訪問。這是一種定義只能在內(nèi)象內(nèi)部訪問的代碼的方式。這一技術(shù)得益于Douglas Crockford的工作。他的網(wǎng)站提供了大量的詳述面向?qū)ο蟮腏avaScript的工作機(jī)制和使用方法的文檔:
  JavaScript文章列表http://javascript.crockford.com/
  文章"JavaScript中的私有成員http://javascript.crockford.com/private.html

  我們來看一個(gè)私有方法可以怎樣應(yīng)用中的例子,如程序2-23所示.

  程序2-23. 私有方法只能被構(gòu)造函數(shù)使用的示例:

//一個(gè)表示教室的對(duì)象構(gòu)造器
function Classroom( students, teacher ) {
    //用來顯示教室中的所有學(xué)生的私有方法
    function disp() {
        alert( this.names.join(", ") );
    }
   
    //課程的數(shù)據(jù)存儲(chǔ)在公有的對(duì)象屬性里
    this.students = students;
    this.teacher = teacher;
   
    //調(diào)用私有方法顯示錯(cuò)誤
    disp();
}

//創(chuàng)建一新的教室對(duì)象
var class = new Classroom( [ "John", "Bob" ], "Mr. Smith" );

//失敗,因?yàn)閐isp不是該對(duì)象的公有方法
class.disp();

  盡管很簡(jiǎn)單,私有方法卻是非常重要的,它可以在保持你的代碼免于沖突同時(shí)允許對(duì)你的用戶可見和可用的施以更強(qiáng)大的控制。接下來,我們來研究特權(quán)方法。它是你的對(duì)象中可以使用的私有方法和共有方法的聯(lián)合。

  特權(quán)方法

  "特權(quán)方法"一語是Douglas Crockford創(chuàng)造的,用來稱呼那種能夠觀察和維護(hù)私有變量而又可以作為一種公有方法被用戶訪問的方法。程序2-24展示了使用特權(quán)方法的一個(gè)例子。
  
  程序2-24 使用特權(quán)方法一例

//創(chuàng)建一個(gè)新的User對(duì)象構(gòu)造器
function User( name, age ) {
    //計(jì)算用戶的出生年份
    var year = (new Date()).getFullYear() – age;

    //創(chuàng)建一個(gè)新特權(quán)方法,對(duì)變量year有訪問權(quán),
    //但又是公共可訪問的
    this.getYearBorn = function(){
        return year;
    };
}

//創(chuàng)建一個(gè)User對(duì)象的新實(shí)例
var user = new User( "Bob", 44 );

//驗(yàn)證返回的出生年份是否正確
alert( user.getYearBorn() == 1962 );

//并注意我們不能訪問對(duì)象的私有屬性year
alert( user.year == null );

  本質(zhì)上,特權(quán)方法是動(dòng)態(tài)生成的方法,因?yàn)樗鼈兪窃谶\(yùn)行時(shí)而不是代碼初次編譯時(shí)添加給對(duì)象的。這種技術(shù)在計(jì)算量上要比綁定一個(gè)簡(jiǎn)單的方法到對(duì)象的prototype上來得昂貴,但同時(shí)也的強(qiáng)大和靈活得多。程序2-25展示了使用動(dòng)態(tài)生成的方法可以實(shí)現(xiàn)什么。

  程序2-25. 新對(duì)象初始化時(shí)創(chuàng)建的動(dòng)態(tài)方法的示例

//創(chuàng)建一個(gè)新的接受properties對(duì)象的對(duì)象
function User( properties ) {
    //遍歷對(duì)象屬性,確保它作用域正確(如前所述)
    for ( var i in properties ) { (function(){
        //為屬性創(chuàng)建獲取器
        this[ "get" + i ] = function() {
            return properties[i];
        };

        //為屬性創(chuàng)建設(shè)置器
        this[ "set" + i ] = function(val) {
            properties[i] = val;
        };
    })(); }
}

//創(chuàng)建一個(gè)新user對(duì)象實(shí)例,傳入一個(gè)包含屬性的對(duì)象作為種子
var user = new User({
    name: "Bob",
    age: 44
});

//請(qǐng)注意name屬性并不存在,因?yàn)樗趐roperties對(duì)象中,是私有的
alert( user.name == null );

//然而,我們能夠使用用動(dòng)態(tài)生成的方法getname來訪問它
alert( user.getname() == "Bob" );

//最后,我們能看到,通過新生成的動(dòng)態(tài)方法設(shè)置和獲取age都是可以的
user.setage( 22 );
alert( user.getage() == 22 );

  (譯注:這段程序是錯(cuò)誤的。那個(gè)匿名函數(shù)里的this錯(cuò)誤地指向了匿名函數(shù)的上下文,而其中的變量i卻又恰仍屬User 的上下文)
  動(dòng)態(tài)生成的代碼的力量不可低估。能夠基于變量的值實(shí)時(shí)的生成代碼是極其有用;這與在其它語言(如Lisp)中宏那樣強(qiáng)大的道理是一樣的,不過是放在一種現(xiàn)代編程語言的背景里。接下來,我們將看到一類純粹因其組織上的優(yōu)勢(shì)而有用的方法。

  靜態(tài)方法

  靜態(tài)方法背后的前提其實(shí)跟其它任何方法是一樣的。然而,最主要的不同在于,這些方法作為對(duì)象的靜態(tài)屬性而存在。作為屬性,它們?cè)谠搶?duì)象的實(shí)例上下文中不可訪問;它們只有在與主對(duì)象本身相同的上下文是可用的。這些與傳統(tǒng)的類繼承的相似點(diǎn),使得他們有點(diǎn)像是靜態(tài)的類方法。
  實(shí)際上,以這種方式編寫代碼的唯一好處在于,這種方法保持對(duì)象名稱空間的干凈,——這一概念我就在第三章中更一步論述。程序2-26展示了附加在對(duì)象上的靜態(tài)方法的一個(gè)例子。

  程序2-26. 靜態(tài)方法的簡(jiǎn)單示例

//附加在User對(duì)象上的一個(gè)靜態(tài)方法
User.cloneUser = function( user ) {
    //創(chuàng)建并返回一個(gè)新的User對(duì)象
    return new User(
        //該對(duì)象是其它user對(duì)象的克隆
        user.getName(),
        user.getAge()
    );
};

  靜態(tài)方法是我們遇到的第一種純粹以組織代碼為目的的方法。這是向我們將要看到的下一章的重要過渡。開發(fā)專業(yè)品質(zhì)JavaScript的一個(gè)基本側(cè)觀點(diǎn),就是要有能力快速、平靜地與其它代碼段接口,同時(shí)保持可理解地可用性。這是一個(gè)重要的奮斗目標(biāo),也是我們下一章里所期望達(dá)到的。

經(jīng)典論壇討論
http://bbs.blueidea.com/thread-2734050-1-1.html

本文鏈接:http://www.95time.cn/tech/web/2007/4618.asp 

出處:藍(lán)色理想
責(zé)任編輯:moby

上一頁 語言特性:上下文 下一頁

◎進(jìn)入論壇網(wǎng)頁制作、網(wǎng)站綜合版塊參加討論

相關(guān)文章 更多相關(guān)鏈接
JavaScript 的事件冒泡 demo 
現(xiàn)代 javscript 編程
JS+ASP打造無刷新新聞列表
網(wǎng)頁制作前臺(tái)之javascript
我的微型論壇的簡(jiǎn)單教程
作者文章
一個(gè)比較漂亮的日歷
仿DW8代碼折疊的HTML編輯器
關(guān)鍵字搜索 常規(guī)搜索 推薦文檔
熱門搜索:CSS Fireworks 設(shè)計(jì)比賽 網(wǎng)頁制作 web標(biāo)準(zhǔn) 用戶體驗(yàn) UE photoshop Dreamweaver Studio8 Flash 手繪 CG
站點(diǎn)最新 站點(diǎn)最新列表
周大福“敬•自然”設(shè)計(jì)大賽開啟
國(guó)際體驗(yàn)設(shè)計(jì)大會(huì)7月將在京舉行
中國(guó)國(guó)防科技信息中心標(biāo)志征集
云計(jì)算如何讓安全問題可控
云計(jì)算是多數(shù)企業(yè)唯一擁抱互聯(lián)網(wǎng)的機(jī)會(huì)
阿里行云
云手機(jī)年終巨獻(xiàn),送禮標(biāo)配299起
阿里巴巴CTO王堅(jiān)的"云和互聯(lián)網(wǎng)觀"
1499元買真八核 云OS雙蛋大促
首屆COCO桌面手機(jī)主題設(shè)計(jì)大賽
欄目最新 欄目最新列表
淺談JavaScript編程語言的編碼規(guī)范
如何在illustrator中繪制臺(tái)歷
Ps簡(jiǎn)單繪制一個(gè)可愛的鉛筆圖標(biāo)
數(shù)據(jù)同步算法研究
用ps作簡(jiǎn)單的作品展示頁面
CSS定位機(jī)制之一:普通流
25個(gè)最佳最閃亮的Eclipse開發(fā)項(xiàng)目
Illustrator中制作針線縫制文字效果
Photoshop制作印刷凹凸字體
VS2010中創(chuàng)建自定義SQL Rule
>> 分頁 首頁 前頁 后頁 尾頁 頁次:7/71個(gè)記錄/頁 轉(zhuǎn)到 頁 共7個(gè)記錄

藍(lán)色理想版權(quán)申明:除部分特別聲明不要轉(zhuǎn)載,或者授權(quán)我站獨(dú)家播發(fā)的文章外,大家可以自由轉(zhuǎn)載我站點(diǎn)的原創(chuàng)文章,但原作者和來自我站的鏈接必須保留(非我站原創(chuàng)的,按照原來自一節(jié),自行鏈接)。文章版權(quán)歸我站和作者共有。

轉(zhuǎn)載要求:轉(zhuǎn)載之圖片、文件,鏈接請(qǐng)不要盜鏈到本站,且不準(zhǔn)打上各自站點(diǎn)的水印,亦不能抹去我站點(diǎn)水印。

特別注意:本站所提供的攝影照片,插畫,設(shè)計(jì)作品,如需使用,請(qǐng)與原作者聯(lián)系,版權(quán)歸原作者所有,文章若有侵犯作者版權(quán),請(qǐng)與我們聯(lián)系,我們將立即刪除修改。

您的評(píng)論
用戶名:  口令:
說明:輸入正確的用戶名和密碼才能參與評(píng)論。如果您不是本站會(huì)員,你可以注冊(cè) 為本站會(huì)員。
注意:文章中的鏈接、內(nèi)容等需要修改的錯(cuò)誤,請(qǐng)用報(bào)告錯(cuò)誤,以利文檔及時(shí)修改。
不評(píng)分 1 2 3 4 5
注意:請(qǐng)不要在評(píng)論中含與內(nèi)容無關(guān)的廣告鏈接,違者封ID
請(qǐng)您注意:
·不良評(píng)論請(qǐng)用報(bào)告管理員,以利管理員及時(shí)刪除。
·尊重網(wǎng)上道德,遵守中華人民共和國(guó)的各項(xiàng)有關(guān)法律法規(guī)
·承擔(dān)一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責(zé)任
·本站評(píng)論管理人員有權(quán)保留或刪除其管轄評(píng)論中的任意內(nèi)容
·您在本站發(fā)表的作品,本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用
·參與本評(píng)論即表明您已經(jīng)閱讀并接受上述條款
推薦文檔 | 打印文檔 | 評(píng)論文檔 | 報(bào)告錯(cuò)誤  
專業(yè)書推薦 更多內(nèi)容
網(wǎng)站可用性測(cè)試及優(yōu)化指南
《寫給大家看的色彩書1》
《跟我去香港》
眾妙之門—網(wǎng)站UI 設(shè)計(jì)之道
《Flex 4.0 RIA開發(fā)寶典》
《贏在設(shè)計(jì)》
犀利開發(fā)—jQuery內(nèi)核詳解與實(shí)踐
作品集 更多內(nèi)容

雜⑦雜⑧ Gold NORMANA V2