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

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

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

    sunfruit[請訪問http://www.fruitres.cn]

    --我相信JAVA能走得更遠 QQ:316228067

    [轉]JavaScript面向對象的特性

    如果你使用JavaScript編程,你或許會懷疑它是否包含了面向對象(OO)的結構。實際上,JavaScript的確支持面向對象的架構――在某種程度上。本文將通過一個可擴展向量圖形(SVG)的實例來說明JavaScript的OO結構。

    我如何在類中定義方法和屬性?

    OO開發的一個基本方面是類及其相應的方法和/或屬性的使用。JavaScript通過function關鍵字支持類(及其屬性)的使用。下面的代碼定義了一個叫做Figure的JavaScript類:
    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;
    } }

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

    嚴格的說,Figure()函數沒有定義一個類,但是它仿造了一個。它實際上創建了一個對象,在括號里的代碼使這個對象的構造器。JavaScript的對象支持是很基礎的,它并不區分類和對象。
    這就引到了問題為什么Figure()函數創建的是一個對象。對象是可以有屬性和方法的。基本上,因為Figure()函數同時包含了屬性和方法,它就是個對象。在JavaScript里,所有的函數即是對象又是可調用的代碼塊。這不像它聽起來的那樣容易被誤解。要創建一個Figure()類/對象,你只用使用以下句法:
    MyFigure = new Figure();
    你也可以把Figure()函數當作代碼塊調用,就像這樣:
    figValue = Figure();
    變量figValue沒有被定義是因為代碼塊Figure()沒有返回任何值。如果你把return(this.area)加到函數的最后一行,figValue就會有個值0。所以figValue是個類型數字,MyFigure是對象 Rectangle的實例。
    為什么所有的變量前面都一個“this”?

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

    這些類有層次之分嗎?

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

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

    在JavaScript里創建一個類的實例很容易:
    rect = new Rectangle(100,100,900,800);
    這就創建了Rectangle類型的一個對象。Rectangle的構造器在屬性width, height, centerX, 和centerY中填入了值。rect.area屬性的值是零(0)。使用這個命令就能調用area方法:
    rect.computeArea();
    rect.area的值現在是560,000。要調用transform方法使用:
    rect.transform(100,200,0);

    父和子對象的屬性可以像這樣訪問到:
    var ar = rect.area;
    var wi = rect.width;

    我能超越屬性和方法嗎?

    就像你在Java中的一樣,你可以超越屬性和方法。在子類中定義的屬性或者方法可以超越同名的父類的屬性和方法。
    和全局變量互動
    JavaScript也支持全局變量的使用。在以下代碼段中測試一下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(不是你預計的40),這是因為Rectangle對象是Figure對象的原型,這種關系在test()被調用以前就被定義了。要使用g_area的新值,你需要用以下的方法:

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

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

    這將改變Rectangle所有現存的以及新實例的area屬性的值。
    結論

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

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

    主站蜘蛛池模板: 国产精品永久免费10000| 精品无码国产污污污免费网站| 男女猛烈xx00免费视频试看| 一级一看免费完整版毛片| 国产成人免费网站在线观看| 亚洲精品视频免费| 久久亚洲中文无码咪咪爱| 在线播放免费播放av片| 国产免费拔擦拔擦8x| 亚洲国产精品VA在线观看麻豆| 国产JIZZ中国JIZZ免费看| 久久亚洲高清综合| 男女一进一出抽搐免费视频| 免费播放一区二区三区| 亚洲国产香蕉碰碰人人| 91禁漫免费进入| 亚洲一区二区三区四区视频 | 久久亚洲熟女cc98cm| 全免费a级毛片免费看| 久久久无码精品亚洲日韩蜜桃| 中文日本免费高清| 亚洲色偷偷偷鲁综合| 99久久久国产精品免费牛牛 | 国产麻豆一精品一AV一免费| 亚洲毛片免费视频| 久久精品国产亚洲一区二区三区| 亚洲视频在线免费| 亚洲国产成人久久精品影视| 中文毛片无遮挡高潮免费| 亚洲宅男精品一区在线观看| 成人爱做日本视频免费| 亚洲美女激情视频| 毛片免费观看网址| 亚洲视屏在线观看| 毛片免费观看网站| 中国人免费观看高清在线观看二区| 亚洲A∨无码无在线观看| 免费看国产成年无码AV片| 色多多免费视频观看区一区| 亚洲av永久无码精品古装片| 最近2019中文字幕mv免费看 |