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>