JavaScript中的面向?qū)ο蠼榻B
更新時(shí)間:2012年06月30日 00:28:21 作者:
在JavaScript,可以說everything is object,那么什么是對象?對象就是包含一組變量和函數(shù)的集合。在其它面向?qū)ο笳Z言中對象是由類的實(shí)例化而來,JavaScript是基于原型的面向?qū)ο笳Z言,沒有類的概念,對象派生自現(xiàn)有對象的副本
對象
創(chuàng)建
對象
構(gòu)造函數(shù)
公有、私有、特權(quán)、靜態(tài)成員
this、call和apply
異常處理
繼承
原型
對象
在JavaScript,可以說everything is object,那么什么是對象?對象就是包含一組變量和函數(shù)的集合。在其它面向?qū)ο笳Z言中對象是由類的實(shí)例化而來,JavaScript是基于原型的面向?qū)ο笳Z言,沒有類的概念,對象派生自現(xiàn)有對象的副本。JavaScript中對象可以分為兩類:Function和Object。
創(chuàng)建對象
為了提高效率,JavaScript自帶內(nèi)置對象,例如:Object、Function、Array等,所有內(nèi)置對象都可以通過new來創(chuàng)建。Function對象分為兩類:實(shí)例和構(gòu)造函數(shù)。例如alert('my name is X')是Function的實(shí)例;而作為構(gòu)造函數(shù)的Function,必須通過new來實(shí)例化。創(chuàng)建的對象的語法分為以下幾種:
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)建對象Function類似
var myFunction=new Function('a',/*代碼*/)
function myFunction(a){
/*代碼*/
}
但是由于第一種有性能問題推薦使用第二種;Function對象的特點(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è)還好理解,但是對于既可以是構(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不會應(yīng)用到由myConstructor的任何新的實(shí)例中。
公有成員
能夠跟隨對象實(shí)例化的成員稱之為公有成員,成為公有成員需要修改函數(shù)的原型,即prototype。公有方法可以隨構(gòu)造函數(shù)而被繼承下去,方法如下:
function myConstructor(){
}
//添加公有屬性
myConstructor.prototype.myName='LD';
//實(shí)例化
var myObj=new myConstructor();
alert(myObj.myName);
由myConstructor實(shí)例化的對象可以使用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);
}
}
對象字面量
前面我們使用的創(chuàng)建用的都是點(diǎn),例如myConstructor.name=x;myConstructor.sex=x。我們也可以使用對象字面量來達(dá)到相同的目的,例如:
function myConstructor(){
}
//添加公有成員
myConstructor.prototype={
name:'LD',
sex:'male',
method:function(){}
}
注意,對象字面量中分隔符為逗號,且最后一個(gè)屬性或方法最后沒有逗號,以防解析錯(cuò)誤。
this、call和apply
this,是一個(gè)依賴于執(zhí)行環(huán)境的關(guān)鍵字,與創(chuàng)建位置無關(guān),this關(guān)鍵字指向的的是使用包含它的函數(shù)的對象,學(xué)過C++和其它語言來說,這個(gè)不難理解。
call和applay,這兩個(gè)的作用強(qiáng)制把方法附加到某個(gè)對象,例如:
//alertName是已經(jīng)創(chuàng)建好的函數(shù)
//alertName不需要參數(shù)時(shí)
alertName.call('對象')
//alertName需要參數(shù)時(shí)
alertName.call('對象',‘參數(shù)1','參數(shù)2')
//alertName使用參數(shù)數(shù)組時(shí)
alertName.applay('對象',‘參數(shù)數(shù)組arguments')
異常處理
和c#類似,由try、catch組成,如下:
function myFunction(){
window.style.color='red';
}
try{
myFunction();
}
catch{
alert('異常信息:'+exception.name + exception.message)
}
繼承和原型較多,放到下一篇博客《JavaScript中的繼承和原型》
創(chuàng)建
對象
構(gòu)造函數(shù)
公有、私有、特權(quán)、靜態(tài)成員
this、call和apply
異常處理
繼承
原型
對象
在JavaScript,可以說everything is object,那么什么是對象?對象就是包含一組變量和函數(shù)的集合。在其它面向?qū)ο笳Z言中對象是由類的實(shí)例化而來,JavaScript是基于原型的面向?qū)ο笳Z言,沒有類的概念,對象派生自現(xiàn)有對象的副本。JavaScript中對象可以分為兩類:Function和Object。
創(chuàng)建對象
為了提高效率,JavaScript自帶內(nèi)置對象,例如:Object、Function、Array等,所有內(nèi)置對象都可以通過new來創(chuàng)建。Function對象分為兩類:實(shí)例和構(gòu)造函數(shù)。例如alert('my name is X')是Function的實(shí)例;而作為構(gòu)造函數(shù)的Function,必須通過new來實(shí)例化。創(chuàng)建的對象的語法分為以下幾種:
復(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)建對象Function類似
復(fù)制代碼 代碼如下:
var myFunction=new Function('a',/*代碼*/)
function myFunction(a){
/*代碼*/
}
但是由于第一種有性能問題推薦使用第二種;Function對象的特點(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è)還好理解,但是對于既可以是構(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不會應(yīng)用到由myConstructor的任何新的實(shí)例中。
公有成員
能夠跟隨對象實(shí)例化的成員稱之為公有成員,成為公有成員需要修改函數(shù)的原型,即prototype。公有方法可以隨構(gòu)造函數(shù)而被繼承下去,方法如下:
復(fù)制代碼 代碼如下:
function myConstructor(){
}
//添加公有屬性
myConstructor.prototype.myName='LD';
//實(shí)例化
var myObj=new myConstructor();
alert(myObj.myName);
由myConstructor實(shí)例化的對象可以使用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);
}
}
對象字面量
前面我們使用的創(chuàng)建用的都是點(diǎn),例如myConstructor.name=x;myConstructor.sex=x。我們也可以使用對象字面量來達(dá)到相同的目的,例如:
復(fù)制代碼 代碼如下:
function myConstructor(){
}
//添加公有成員
myConstructor.prototype={
name:'LD',
sex:'male',
method:function(){}
}
注意,對象字面量中分隔符為逗號,且最后一個(gè)屬性或方法最后沒有逗號,以防解析錯(cuò)誤。
this、call和apply
this,是一個(gè)依賴于執(zhí)行環(huán)境的關(guān)鍵字,與創(chuàng)建位置無關(guān),this關(guān)鍵字指向的的是使用包含它的函數(shù)的對象,學(xué)過C++和其它語言來說,這個(gè)不難理解。
call和applay,這兩個(gè)的作用強(qiáng)制把方法附加到某個(gè)對象,例如:
復(fù)制代碼 代碼如下:
//alertName是已經(jīng)創(chuàng)建好的函數(shù)
//alertName不需要參數(shù)時(shí)
alertName.call('對象')
//alertName需要參數(shù)時(shí)
alertName.call('對象',‘參數(shù)1','參數(shù)2')
//alertName使用參數(shù)數(shù)組時(shí)
alertName.applay('對象',‘參數(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 工具庫 Cloudgamer JavaScript Library v0.1 發(fā)布
研究了一年多的js,也差不多寫一個(gè)自己的js庫了。 我寫這個(gè)不算框架,只是一個(gè)小型的js工具庫,所以我用的名字是Library。2009-10-10JavaScript中使用構(gòu)造函數(shù)實(shí)現(xiàn)繼承的代碼
JavaScript中借用構(gòu)造函數(shù)實(shí)現(xiàn)繼承的代碼,需要的朋友可以參考下。2010-08-08javascript 模式設(shè)計(jì)之工廠模式學(xué)習(xí)心得
接口的實(shí)現(xiàn),從而使不同子類可以被同等的對待,恰當(dāng)?shù)氖褂霉S模式,但不要拘泥與形式,理解本質(zhì)。2010-04-04javascript 面向?qū)ο缶幊袒A(chǔ):封裝
“在面向?qū)ο蟮乃枷胫?,最核心的概念之一就是類。一個(gè)類表示了具有相似性質(zhì)的一類事物的抽象,通過實(shí)例化一個(gè)類,可以獲得屬于該類的一個(gè)實(shí)例(即對象)”。2009-08-08Javascript面向?qū)ο笤O(shè)計(jì)一 工廠模式
工廠模式抽象了創(chuàng)建具體對象的過程,但是在ECMAScript中無法創(chuàng)建類,所以就使用一種函數(shù)來封裝以特定接口創(chuàng)建對象的細(xì)節(jié)2011-12-12javascript 面向?qū)ο笕吕砭氈當(dāng)?shù)據(jù)的封裝
JavaScript 是一種非常靈活的面向?qū)ο蟪绦蛟O(shè)計(jì)語言,它與傳統(tǒng)的強(qiáng)類型的面向?qū)ο蟪绦蛟O(shè)計(jì)語言(如 C++,Java,C# 等)有很大不同,所以要實(shí)現(xiàn)如 C++、java、C# 當(dāng)中的一些特性就需要換一種思考方式來解決。2009-12-12JavaScript為對象原型prototype添加屬性的兩種方式
為對象原型prototype添加屬性的的方法, 需要的朋友可以參考下。2010-08-08