JavaScript中的面向?qū)ο蠼榻B
更新時(shí)間:2012年06月30日 00:28:21 作者:
在JavaScript,可以說everything is object,那么什么是對(duì)象?對(duì)象就是包含一組變量和函數(shù)的集合。在其它面向?qū)ο笳Z言中對(duì)象是由類的實(shí)例化而來,JavaScript是基于原型的面向?qū)ο笳Z言,沒有類的概念,對(duì)象派生自現(xiàn)有對(duì)象的副本
對(duì)象
創(chuàng)建
對(duì)象
構(gòu)造函數(shù)
公有、私有、特權(quán)、靜態(tài)成員
this、call和apply
異常處理
繼承
原型
對(duì)象
在JavaScript,可以說everything is object,那么什么是對(duì)象?對(duì)象就是包含一組變量和函數(shù)的集合。在其它面向?qū)ο笳Z言中對(duì)象是由類的實(shí)例化而來,JavaScript是基于原型的面向?qū)ο笳Z言,沒有類的概念,對(duì)象派生自現(xiàn)有對(duì)象的副本。JavaScript中對(duì)象可以分為兩類:Function和Object。
創(chuàng)建對(duì)象
為了提高效率,JavaScript自帶內(nèi)置對(duì)象,例如:Object、Function、Array等,所有內(nèi)置對(duì)象都可以通過new來創(chuàng)建。Function對(duì)象分為兩類:實(shí)例和構(gòu)造函數(shù)。例如alert('my name is X')是Function的實(shí)例;而作為構(gòu)造函數(shù)的Function,必須通過new來實(shí)例化。創(chuàng)建的對(duì)象的語法分為以下幾種:
var obj= new Object();var obj={};(Array等類似)
var myFunction=new Function(){//代碼};function myFunction(){//代碼}
需要注意的是,第一種Function聲明必須在使用之前,而第二種可以在使用之后。
構(gòu)造函數(shù)
Function是構(gòu)造函數(shù)的起點(diǎn),創(chuàng)建構(gòu)造函數(shù)與上述創(chuàng)建對(duì)象Function類似
var myFunction=new Function('a',/*代碼*/)
function myFunction(a){
/*代碼*/
}
但是由于第一種有性能問題推薦使用第二種;Function對(duì)象的特點(diǎn)是:它的實(shí)例也能作為構(gòu)造函數(shù) 。
靜態(tài)成員
如下代碼:
var myObj= new Object();
//添加name屬性
myObj.name='LD';
//添加alertName方法
myObj.alertName=function(){
alert(this.name);
}
//執(zhí)行alertName
myObj.alertName();
name和alertName僅僅存在于myObj實(shí)例中,不存在于構(gòu)造函數(shù)。這個(gè)還好理解,但是對(duì)于既可以是構(gòu)造函數(shù)也可以是實(shí)例的Function來說就不那么容易理解了,如下:
var myConstructor=new function(){
//添加靜態(tài)屬性
myConstructor.name='LD';
//添加靜態(tài)方法
myConstructor.alertName=function(){
alert(this.nam);
}
}
myConstructor.alertName();
代碼可以正常運(yùn)行,因?yàn)閙yConstructor可以是實(shí)例,但是name和alertName不會(huì)應(yīng)用到由myConstructor的任何新的實(shí)例中。
公有成員
能夠跟隨對(duì)象實(shí)例化的成員稱之為公有成員,成為公有成員需要修改函數(shù)的原型,即prototype。公有方法可以隨構(gòu)造函數(shù)而被繼承下去,方法如下:
function myConstructor(){
}
//添加公有屬性
myConstructor.prototype.myName='LD';
//實(shí)例化
var myObj=new myConstructor();
alert(myObj.myName);
由myConstructor實(shí)例化的對(duì)象可以使用myName,但是myConstructor本身不可以,因?yàn)槲覀儼压谐蓡T加到了myConstructor的底層定義中,而非myConstructor實(shí)例本身。
私有成員
私有成員指的是在構(gòu)造函數(shù)中定義的變量和方法,與其它語言的類中用private定義類似,例如:
function myConstructor(){
//添加私有屬性
var myName='Ld'l
//添加私有方法
var alertName=function(){
alert('LD');
}
alertName();
特權(quán)成員
特權(quán)方法,指的是可以被公開訪問,同時(shí)其能訪問私有成員,在構(gòu)造函數(shù)作用域總使用this定義的方法,類似其它語言中的公有方法,如下:
function myConstructor(){
//私有屬性
var sex='male';
// 特權(quán)方法
this.alertSex=function(){
alert(sex);
}
}
對(duì)象字面量
前面我們使用的創(chuàng)建用的都是點(diǎn),例如myConstructor.name=x;myConstructor.sex=x。我們也可以使用對(duì)象字面量來達(dá)到相同的目的,例如:
function myConstructor(){
}
//添加公有成員
myConstructor.prototype={
name:'LD',
sex:'male',
method:function(){}
}
注意,對(duì)象字面量中分隔符為逗號(hào),且最后一個(gè)屬性或方法最后沒有逗號(hào),以防解析錯(cuò)誤。
this、call和apply
this,是一個(gè)依賴于執(zhí)行環(huán)境的關(guān)鍵字,與創(chuàng)建位置無關(guān),this關(guān)鍵字指向的的是使用包含它的函數(shù)的對(duì)象,學(xué)過C++和其它語言來說,這個(gè)不難理解。
call和applay,這兩個(gè)的作用強(qiáng)制把方法附加到某個(gè)對(duì)象,例如:
//alertName是已經(jīng)創(chuàng)建好的函數(shù)
//alertName不需要參數(shù)時(shí)
alertName.call('對(duì)象')
//alertName需要參數(shù)時(shí)
alertName.call('對(duì)象',‘參數(shù)1','參數(shù)2')
//alertName使用參數(shù)數(shù)組時(shí)
alertName.applay('對(duì)象',‘參數(shù)數(shù)組arguments')
異常處理
和c#類似,由try、catch組成,如下:
function myFunction(){
window.style.color='red';
}
try{
myFunction();
}
catch{
alert('異常信息:'+exception.name + exception.message)
}
繼承和原型較多,放到下一篇博客《JavaScript中的繼承和原型》
創(chuàng)建
對(duì)象
構(gòu)造函數(shù)
公有、私有、特權(quán)、靜態(tài)成員
this、call和apply
異常處理
繼承
原型
對(duì)象
在JavaScript,可以說everything is object,那么什么是對(duì)象?對(duì)象就是包含一組變量和函數(shù)的集合。在其它面向?qū)ο笳Z言中對(duì)象是由類的實(shí)例化而來,JavaScript是基于原型的面向?qū)ο笳Z言,沒有類的概念,對(duì)象派生自現(xiàn)有對(duì)象的副本。JavaScript中對(duì)象可以分為兩類:Function和Object。
創(chuàng)建對(duì)象
為了提高效率,JavaScript自帶內(nèi)置對(duì)象,例如:Object、Function、Array等,所有內(nèi)置對(duì)象都可以通過new來創(chuàng)建。Function對(duì)象分為兩類:實(shí)例和構(gòu)造函數(shù)。例如alert('my name is X')是Function的實(shí)例;而作為構(gòu)造函數(shù)的Function,必須通過new來實(shí)例化。創(chuàng)建的對(duì)象的語法分為以下幾種:
復(fù)制代碼 代碼如下:
var obj= new Object();var obj={};(Array等類似)
var myFunction=new Function(){//代碼};function myFunction(){//代碼}
需要注意的是,第一種Function聲明必須在使用之前,而第二種可以在使用之后。
構(gòu)造函數(shù)
Function是構(gòu)造函數(shù)的起點(diǎn),創(chuàng)建構(gòu)造函數(shù)與上述創(chuàng)建對(duì)象Function類似
復(fù)制代碼 代碼如下:
var myFunction=new Function('a',/*代碼*/)
function myFunction(a){
/*代碼*/
}
但是由于第一種有性能問題推薦使用第二種;Function對(duì)象的特點(diǎn)是:它的實(shí)例也能作為構(gòu)造函數(shù) 。
靜態(tài)成員
如下代碼:
復(fù)制代碼 代碼如下:
var myObj= new Object();
//添加name屬性
myObj.name='LD';
//添加alertName方法
myObj.alertName=function(){
alert(this.name);
}
//執(zhí)行alertName
myObj.alertName();
name和alertName僅僅存在于myObj實(shí)例中,不存在于構(gòu)造函數(shù)。這個(gè)還好理解,但是對(duì)于既可以是構(gòu)造函數(shù)也可以是實(shí)例的Function來說就不那么容易理解了,如下:
復(fù)制代碼 代碼如下:
var myConstructor=new function(){
//添加靜態(tài)屬性
myConstructor.name='LD';
//添加靜態(tài)方法
myConstructor.alertName=function(){
alert(this.nam);
}
}
myConstructor.alertName();
代碼可以正常運(yùn)行,因?yàn)閙yConstructor可以是實(shí)例,但是name和alertName不會(huì)應(yīng)用到由myConstructor的任何新的實(shí)例中。
公有成員
能夠跟隨對(duì)象實(shí)例化的成員稱之為公有成員,成為公有成員需要修改函數(shù)的原型,即prototype。公有方法可以隨構(gòu)造函數(shù)而被繼承下去,方法如下:
復(fù)制代碼 代碼如下:
function myConstructor(){
}
//添加公有屬性
myConstructor.prototype.myName='LD';
//實(shí)例化
var myObj=new myConstructor();
alert(myObj.myName);
由myConstructor實(shí)例化的對(duì)象可以使用myName,但是myConstructor本身不可以,因?yàn)槲覀儼压谐蓡T加到了myConstructor的底層定義中,而非myConstructor實(shí)例本身。
私有成員
私有成員指的是在構(gòu)造函數(shù)中定義的變量和方法,與其它語言的類中用private定義類似,例如:
復(fù)制代碼 代碼如下:
function myConstructor(){
//添加私有屬性
var myName='Ld'l
//添加私有方法
var alertName=function(){
alert('LD');
}
alertName();
特權(quán)成員
特權(quán)方法,指的是可以被公開訪問,同時(shí)其能訪問私有成員,在構(gòu)造函數(shù)作用域總使用this定義的方法,類似其它語言中的公有方法,如下:
復(fù)制代碼 代碼如下:
function myConstructor(){
//私有屬性
var sex='male';
// 特權(quán)方法
this.alertSex=function(){
alert(sex);
}
}
對(duì)象字面量
前面我們使用的創(chuàng)建用的都是點(diǎn),例如myConstructor.name=x;myConstructor.sex=x。我們也可以使用對(duì)象字面量來達(dá)到相同的目的,例如:
復(fù)制代碼 代碼如下:
function myConstructor(){
}
//添加公有成員
myConstructor.prototype={
name:'LD',
sex:'male',
method:function(){}
}
注意,對(duì)象字面量中分隔符為逗號(hào),且最后一個(gè)屬性或方法最后沒有逗號(hào),以防解析錯(cuò)誤。
this、call和apply
this,是一個(gè)依賴于執(zhí)行環(huán)境的關(guān)鍵字,與創(chuàng)建位置無關(guān),this關(guān)鍵字指向的的是使用包含它的函數(shù)的對(duì)象,學(xué)過C++和其它語言來說,這個(gè)不難理解。
call和applay,這兩個(gè)的作用強(qiáng)制把方法附加到某個(gè)對(duì)象,例如:
復(fù)制代碼 代碼如下:
//alertName是已經(jīng)創(chuàng)建好的函數(shù)
//alertName不需要參數(shù)時(shí)
alertName.call('對(duì)象')
//alertName需要參數(shù)時(shí)
alertName.call('對(duì)象',‘參數(shù)1','參數(shù)2')
//alertName使用參數(shù)數(shù)組時(shí)
alertName.applay('對(duì)象',‘參數(shù)數(shù)組arguments')
異常處理
和c#類似,由try、catch組成,如下:
復(fù)制代碼 代碼如下:
function myFunction(){
window.style.color='red';
}
try{
myFunction();
}
catch{
alert('異常信息:'+exception.name + exception.message)
}
繼承和原型較多,放到下一篇博客《JavaScript中的繼承和原型》
相關(guān)文章
javascript面向?qū)ο笕腴T基礎(chǔ)詳細(xì)介紹
本文章介紹了js中常用的對(duì)象包括有JavaScript對(duì)象簡(jiǎn)介 字符串對(duì)象 date() 數(shù)組 數(shù)學(xué)對(duì)象 函數(shù)對(duì)象 應(yīng)用介紹,有需要了解的同學(xué)可參考一下2012-09-09
JavaScript 設(shè)計(jì)模式之組合模式解析
“組合模式”顧名思意就是將多種實(shí)現(xiàn)組合在一起而達(dá)到牽一處而動(dòng)全身的效果。2010-04-04
面向?qū)ο蟮木幊趟枷朐趈avascript中的運(yùn)用上部
對(duì)于正在從事或者打算從事編程的人來說,面向?qū)ο笫且粋€(gè)耳熟能詳?shù)脑~,幾乎每一個(gè)人都能列舉出一些面向?qū)ο蟮木幊陶Z言,例如C++,JAVA,C#等等。2009-11-11
JavaScript 設(shè)計(jì)模式學(xué)習(xí) Singleton
JavaScript設(shè)計(jì)模式學(xué)習(xí) Singleton
2009-07-07
js對(duì)象的構(gòu)造和繼承實(shí)現(xiàn)代碼
js對(duì)象的構(gòu)造和繼承實(shí)現(xiàn)代碼,學(xué)習(xí)javascript面向?qū)ο蟮呐笥芽梢詤⒖枷?。寫出跟漂亮與復(fù)用的代碼。
2010-12-12 
