<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    sunfruit[請(qǐng)?jiān)L問(wèn)http://www.fruitres.cn]

    --我相信JAVA能走得更遠(yuǎn) QQ:316228067

    [轉(zhuǎn)]JavaScript面向?qū)ο蟮奶匦?/a>

    如果你使用JavaScript編程,你或許會(huì)懷疑它是否包含了面向?qū)ο螅∣O)的結(jié)構(gòu)。實(shí)際上,JavaScript的確支持面向?qū)ο蟮募軜?gòu)――在某種程度上。本文將通過(guò)一個(gè)可擴(kuò)展向量圖形(SVG)的實(shí)例來(lái)說(shuō)明JavaScript的OO結(jié)構(gòu)。

    我如何在類(lèi)中定義方法和屬性?

    OO開(kāi)發(fā)的一個(gè)基本方面是類(lèi)及其相應(yīng)的方法和/或?qū)傩缘氖褂谩avaScript通過(guò)function關(guān)鍵字支持類(lèi)(及其屬性)的使用。下面的代碼定義了一個(gè)叫做Figure的JavaScript類(lèi):
    function Figure() {
    this.centerX=0;
    this.centerY=0;
    this.area=0;
    this.transform = transform; // methods are defined like this
    function transform(moveX,moveY,angle) {
    this.centerX += moveX;
    this.centerY += moveY;
    } }

    這個(gè)Figure類(lèi)有三個(gè)屬性:centerX,centerY,和area。另外,它還有一個(gè)方法叫做transform()。前三行是這個(gè)類(lèi)的構(gòu)造器。
    但是它看起來(lái)不像一個(gè)類(lèi)
    你會(huì)想Figure()看起來(lái)不像一個(gè)類(lèi),而更像一個(gè)JavaScript的函數(shù)。那么為什么Figure()定義的是個(gè)類(lèi)?

    嚴(yán)格的說(shuō),F(xiàn)igure()函數(shù)沒(méi)有定義一個(gè)類(lèi),但是它仿造了一個(gè)。它實(shí)際上創(chuàng)建了一個(gè)對(duì)象,在括號(hào)里的代碼使這個(gè)對(duì)象的構(gòu)造器。JavaScript的對(duì)象支持是很基礎(chǔ)的,它并不區(qū)分類(lèi)和對(duì)象。
    這就引到了問(wèn)題為什么Figure()函數(shù)創(chuàng)建的是一個(gè)對(duì)象。對(duì)象是可以有屬性和方法的。基本上,因?yàn)镕igure()函數(shù)同時(shí)包含了屬性和方法,它就是個(gè)對(duì)象。在JavaScript里,所有的函數(shù)即是對(duì)象又是可調(diào)用的代碼塊。這不像它聽(tīng)起來(lái)的那樣容易被誤解。要?jiǎng)?chuàng)建一個(gè)Figure()類(lèi)/對(duì)象,你只用使用以下句法:
    MyFigure = new Figure();
    你也可以把Figure()函數(shù)當(dāng)作代碼塊調(diào)用,就像這樣:
    figValue = Figure();
    變量figValue沒(méi)有被定義是因?yàn)榇a塊Figure()沒(méi)有返回任何值。如果你把return(this.area)加到函數(shù)的最后一行,figValue就會(huì)有個(gè)值0。所以figValue是個(gè)類(lèi)型數(shù)字,MyFigure是對(duì)象 Rectangle的實(shí)例。
    為什么所有的變量前面都一個(gè)“this”?

    這個(gè)關(guān)鍵字this表示這是對(duì)象的實(shí)例變量,可以使用MyFigure.centerX從對(duì)象外部訪問(wèn)。要讓變量成為私有變量,去掉前綴this就行了。this.transform = transform這一行讓方法成為公用方法。這個(gè)方法通過(guò)MyFigure.transform(100,100,0)調(diào)用。

    這些類(lèi)有層次之分嗎?

    另一個(gè)好問(wèn)題的是JavaScript的類(lèi)是否有層次之分。回答是肯定有。我們來(lái)仔細(xì)看看是怎么做到分層的。我們可以定義一個(gè)Rectangle子類(lèi),并把Figure作為父類(lèi):

    function Rectangle(startX, startY, endX, endY) {
    this.width = endX - startX;
    this.height = endY - startY;
    this.centerX = (endX + startX)/2;
    this.centerY = (endY + startY)/2;
    this.computeArea = computeArea;
    function computeArea() {
    this.area = this.width*this.height;
    } }
    Rectangle.prototype = new Figure();

    Rectangle對(duì)象是用4個(gè)自變量創(chuàng)建的,前四行是構(gòu)造器。 Rectangle類(lèi)包含了一個(gè)方法: computeArea()。最后一行Rectangle.prototype = new Figure();,把Rectangle類(lèi)定義為從Figure類(lèi)繼承來(lái)的子類(lèi)。
    然我來(lái)解釋一下prototype(原型)。每個(gè)對(duì)象構(gòu)造器都有prototype屬性;這是用來(lái)給所有的對(duì)象增加新屬性和方法的。這就是為什么原型被用來(lái)實(shí)現(xiàn)繼承:child.prototype = new parent();。通過(guò)原型,父對(duì)象的所有屬性和方法都被添加到子對(duì)象上。
    要注意this.centerX,this.centerY,和area是Rectangle類(lèi)中所使用的屬性,但是它們是 Figure父類(lèi)的屬性。和Rectangle類(lèi)相似,Circle類(lèi)可以被定義成Figure類(lèi)的原型。這種父子關(guān)系可以按你需要來(lái)定義深度;你可以創(chuàng)建另一個(gè)Rectangle的子類(lèi)。
    我如何創(chuàng)建一個(gè)類(lèi)的實(shí)例?

    在JavaScript里創(chuàng)建一個(gè)類(lèi)的實(shí)例很容易:
    rect = new Rectangle(100,100,900,800);
    這就創(chuàng)建了Rectangle類(lèi)型的一個(gè)對(duì)象。Rectangle的構(gòu)造器在屬性width, height, centerX, 和centerY中填入了值。rect.area屬性的值是零(0)。使用這個(gè)命令就能調(diào)用area方法:
    rect.computeArea();
    rect.area的值現(xiàn)在是560,000。要調(diào)用transform方法使用:
    rect.transform(100,200,0);

    父和子對(duì)象的屬性可以像這樣訪問(wèn)到:
    var ar = rect.area;
    var wi = rect.width;

    我能超越屬性和方法嗎?

    就像你在Java中的一樣,你可以超越屬性和方法。在子類(lèi)中定義的屬性或者方法可以超越同名的父類(lèi)的屬性和方法。
    和全局變量互動(dòng)
    JavaScript也支持全局變量的使用。在以下代碼段中測(cè)試一下g_area變量的范圍:
    <HTML>
    <SCRIPT>
    var g_area = 20;
    function Figure() {

    this.area=g_area;

    }
    function Rectangle(){ … }
    Rectangle.prototype = new Figure();
    function test(){
    g_area = 40;
    rect = new Rectangle();
    alert(rect.area);
    }
    </SCRIPT>
    <BODY onLoad = 'test()'/>
    </BODY>
    </HTML>
    rect.area的值是20(不是你預(yù)計(jì)的40),這是因?yàn)镽ectangle對(duì)象是Figure對(duì)象的原型,這種關(guān)系在test()被調(diào)用以前就被定義了。要使用g_area的新值,你需要用以下的方法:

    function test() {
    g_area = 40;
    Rectangle.prototype = new Figure();
    rect = new Rectangle();
    alert(rect.area);
    }

    對(duì)于所有的Rectangle的新實(shí)例,這將改變area屬性的值。或者,你可以使用這種方法:function test() {
    g_area = 40;
    rect = new Rectangle();
    Rectangle.prototype.area = g_area;
    alert(rect.area);
    }

    這將改變Rectangle所有現(xiàn)存的以及新實(shí)例的area屬性的值。
    結(jié)論

    為了效仿OO開(kāi)發(fā),JavaScript提供了必需的繼承、封裝和超越屬性,盡管它不支持接口和方法的過(guò)載。如果你是剛接觸到OO開(kāi)發(fā),用它試試。OO概念允許開(kāi)發(fā)者將一組數(shù)據(jù)和相關(guān)操作集中入一個(gè)對(duì)象。這在管理瀏覽器事件和管理瀏覽器內(nèi)SVG圖時(shí)很有用。

    posted on 2006-08-30 09:37 sunfruit 閱讀(413) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): JAVASCRIPT

    主站蜘蛛池模板: 无套内射无矿码免费看黄| 国产成人精品日本亚洲语音| aa在线免费观看| 免费人成网站在线高清| 毛片亚洲AV无码精品国产午夜| 日韩a在线观看免费观看| 亚洲成在人线在线播放无码| 成年女人免费视频播放77777 | 亚洲AV成人片色在线观看 | 牛牛在线精品免费视频观看| 精品国产精品久久一区免费式| 亚洲日韩国产AV无码无码精品| 永久久久免费浮力影院| MM1313亚洲国产精品| 亚洲情侣偷拍精品| 中国人免费观看高清在线观看二区| 国产亚洲精品影视在线产品| 搡女人免费免费视频观看| 久久精品亚洲视频| 99久久久国产精品免费无卡顿| 亚洲精品国产av成拍色拍| 亚洲国产精品日韩专区AV| 最近中文字幕免费大全| 亚洲视频在线不卡| 免费毛片在线看片免费丝瓜视频 | 日韩在线播放全免费| 中文字幕无码亚洲欧洲日韩| 免费大香伊蕉在人线国产| a在线视频免费观看在线视频三区| 九月丁香婷婷亚洲综合色| 中文字幕亚洲免费无线观看日本| 亚洲人成7777| 亚洲成?v人片天堂网无码| 久久免费的精品国产V∧| 亚洲人成网站在线播放2019| 亚洲七七久久精品中文国产| 在线免费观看亚洲| 一级特黄录像免费播放中文版| 亚洲午夜精品久久久久久人妖| 免费无码黄网站在线观看| 成人免费777777被爆出|