JavaScript核心筆記07-物件導向,javascript07-

來源:互聯網
上載者:User

JavaScript核心筆記07-物件導向,javascript07-

JavaScript是基於對象的而非基於類,但是,JavaScript的的函數式語言的特性使得它本身是可程式化的,它可以變成你想要的任何形式。JavaScript的OO風格代碼開發:

1、原型繼承

JavaScript中的繼承可以使用原型鏈來實現,調用對象上的一個方法,由於方法在JavaScript對象中是對另一個函數對象的引用,因此解譯器會在對象中尋找該屬性,如果沒有

找到,則在其內部對象prototype對象上搜尋,由於prototype對象和對象本身的結構是一樣的,因此這一個過程會一直回溯到發現該屬性,則調用該屬性,否則報告一個錯誤。

關於原型繼承,如下例:

//原型繼承function Base(){this.baseFunc=function(){alert("base behavior");}}function Middle(){this.middleFunc=function(){alert("middle behavior");}}Middle.prototype=new Base();//繼承Basefunction Final(){this.finalFunc=function(){alert("final behavior");}}Final.prototype=new Middle();//繼承Middlefunction test(){var obj=new Final();obj.baseFunc();obj.middleFunc();obj.finalFunc();}test();

2、引用

JavaScript的應用和其他語言的不同之處在於,它的引用始終指向最終的對象,而非引用本身,如下例:

//引用執行個體var obj={};//Null 物件var ref=obj;obj.name="objectA";alert(ref.name);//ref也跟著增加了name屬性obj=["one","two","three","four"];//obj指向了另外一個對象(數組對象)alert(ref.name);//ref還指向原來的對象alert(obj.length);//3alert(ref.length);//undefined //說明:<span style="font-size:18px;color:#ff0000;"><strong>obj只是對一個匿名對象的引用</strong></span>,因此,ref並非指向它,當obj指向另一個數組對象時可以看到,引用ref並沒有改變。//而始終指向那個後來添加了name屬性的“空”對象{}。。<strong>修改obj的指向不回影響到ref,但是修改原對象的值,則會影響到其引用對象</strong>。


3、new操作符

採用new操作符定義function對象,可以實作類別似java一樣的對象建立。而對於json格式的對象則不能用new來建立,function(){}這種預設構造定義的對象則可以。

如:

var a={name:'name'};var b=new a();   不可行

var a=function(){alert('3');};var b=new a(); 可行


4、封裝

事實上,我們可以通過JavaScript函數實現封裝,封裝的好處在於,未經授權的客戶代碼無法訪問到我們不公開的資料,如下例:

//封裝,共有、私人的定義function Person(name){//私人變數privatevar address="China";//公有方法publicthis.getAddress=function(){return address;}//共有變數publicthis.name=name;}//通過原型prototype擴充方法,共有方法Person.prototype.getName=function(){return this.name;}Person.prototype.setName=function(name){this.name=name;}
<strong>Person.AGE=1000;//靜態變數</strong>/* 說明:首先聲明一個函數作為模板,用物件導向的術語來講就是一個“類”,用var方式聲明的變數僅在類內部可見,所以address是一個私人成員變數,      訪問address的唯一方式是,<strong>通過暴露出來的getAddress方法,而set/getName方法均為原型鏈上的方法</strong>,因此為公開的。測試如下: */var jay=new Person("jay");alert(jay.name);//可以訪問,返回:jayalert(jay.getName());//可以訪問,返回:jayalert(jay.address);//無法訪問,返回:undefinedalert(jay.getAddress());//可以訪問,返回:China
<strong>alert(Person.AGE);//通過名字來訪問</strong>


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.