對象
建立
對象
建構函式
公有、私人、特權、靜態成員
this、call和apply
異常處理
繼承
原型
對象
在JavaScript,可以說everything is object,那麼什麼是對象?對象就是包含一組變數和函數的集合。在其它物件導向語言中對象是由類的執行個體化而來,JavaScript是基於原型的物件導向語言,沒有類的概念,對象派生自現有對象的副本。JavaScript中對象可以分為兩類:Function和Object。
建立對象
為了提高效率,JavaScript內建內建對象,例如:Object、Function、Array等,所有內建對象都可以通過new來建立。Function對象分為兩類:執行個體和建構函式。例如alert('my name is X')是Function的執行個體;而作為建構函式的Function,必須通過new來執行個體化。建立的對象的文法分為以下幾種: 複製代碼 代碼如下:var obj= new Object();var obj={};(Array等類似)
var myFunction=new Function(){//代碼};function myFunction(){//代碼}
需要注意的是,第一種Function聲明必須在使用之前,而第二種可以在使用之後。
建構函式
Function是建構函式的起點,建立建構函式與上述建立對象Function類似 複製代碼 代碼如下:var myFunction=new Function('a',/*代碼*/)
function myFunction(a){
/*代碼*/
}
但是由於第一種有效能問題推薦使用第二種;Function對象的特點是:它的執行個體也能作為建構函式 。
靜態成員
如下代碼: 複製代碼 代碼如下:var myObj= new Object();
//添加name屬性
myObj.name='LD';
//添加alertName方法
myObj.alertName=function(){
alert(this.name);
}
//執行alertName
myObj.alertName();
name和alertName僅僅存在於myObj執行個體中,不存在於建構函式。這個還好理解,但是對於既可以是建構函式也可以是執行個體的Function來說就不那麼容易理解了,如下: 複製代碼 代碼如下:var myConstructor=new function(){
//添加靜態屬性
myConstructor.name='LD';
//添加靜態方法
myConstructor.alertName=function(){
alert(this.nam);
}
}
myConstructor.alertName();
代碼可以正常運行,因為myConstructor可以是執行個體,但是name和alertName不會應用到由myConstructor的任何新的執行個體中。
公有成員
能夠跟隨對象執行個體化的成員稱之為公有成員,成為公有成員需要修改函數的原型,即prototype。公有方法可以隨建構函式而被繼承下去,方法如下: 複製代碼 代碼如下:function myConstructor(){
}
//添加公有屬性
myConstructor.prototype.myName='LD';
//執行個體化
var myObj=new myConstructor();
alert(myObj.myName);
由myConstructor執行個體化的對象可以使用myName,但是myConstructor本身不可以,因為我們把公有成員加到了myConstructor的底層定義中,而非myConstructor執行個體本身。
私人成員
私人成員指的是在建構函式中定義的變數和方法,與其它語言的類中用private定義類似,例如: 複製代碼 代碼如下:function myConstructor(){
//添加私人屬性
var myName='Ld'l
//添加私人方法
var alertName=function(){
alert('LD');
}
alertName();
特權成員
特權方法,指的是可以被公開訪問,同時其能訪問私人成員,在建構函式範圍總使用this定義的方法,類似其它語言中的公有方法,如下: 複製代碼 代碼如下:function myConstructor(){
//私人屬性
var sex='male';
// 特權方法
this.alertSex=function(){
alert(sex);
}
}
對象字面量
前面我們使用的建立用的都是點,例如myConstructor.name=x;myConstructor.sex=x。我們也可以使用對象字面量來達到相同的目的,例如: 複製代碼 代碼如下:function myConstructor(){
}
//添加公有成員
myConstructor.prototype={
name:'LD',
sex:'male',
method:function(){}
}
注意,對象字面量中分隔字元為逗號,且最後一個屬性或方法最後沒有逗號,以防解析錯誤。
this、call和apply
this,是一個依賴於執行環境的關鍵字,與建立位置無關,this關鍵字指向的的是使用包含它的函數的對象,學過C++和其它語言來說,這個不難理解。
call和applay,這兩個的作用強制把方法附加到某個對象,例如: 複製代碼 代碼如下://alertName是已經建立好的函數
//alertName不需要參數時
alertName.call('對象')
//alertName需要參數時
alertName.call('對象',‘參數1','參數2')
//alertName使用參數數組時
alertName.applay('對象',‘參數數組arguments')
異常處理
和c#類似,由try、catch組成,如下: 複製代碼 代碼如下:function myFunction(){
window.style.color='red';
}
try{
myFunction();
}
catch{
alert('異常資訊:'+exception.name + exception.message)
}
繼承和原型較多,放到下一篇部落格《JavaScript中的繼承和原型》