關(guān)于javascript的面向?qū)ο?/a>
對(duì)于javascript的面向?qū)ο笥胁簧僬f(shuō)法,有的說(shuō),javascript不是面向?qū)ο蟮模械恼f(shuō)javascript是基于對(duì)象的,有的說(shuō)使用javascript可以實(shí)現(xiàn)面向?qū)ο蟆?br />我
查閱了一些資料,包括ECMAscript Language Specification Edition 3
24-Mar-00,似乎應(yīng)該說(shuō)成javascript是基于原型(prototype-based
)的面向?qū)ο螅鳦++,java之類的是基于類的面向?qū)ο螅疵嫦驅(qū)ο蟮膶?shí)現(xiàn)方式不同。面向?qū)ο蟛⒉槐厝皇腔赾lass的。一篇文章中提到的面向?qū)ο?
最主要的三個(gè)特性
* Encapsulation(封裝) - Support for method calls on a Javascript object as a member of a Class.
* Polymorphism(多態(tài))- The ability for two classes to respond to the same (collection of) methods.
* Inheritance (繼承)- The ability to define the behavior of one object in terms of another by sub-classing.
在javascript里都可實(shí)現(xiàn)。
感覺(jué)對(duì)于理解javascript的面向?qū)ο筇匦裕羞@樣幾點(diǎn)需要注意,
1、將面向?qū)ο笞鳛橐粋€(gè)獨(dú)立的通用概念,面向?qū)ο笥胁煌膶?shí)現(xiàn)方式,也有不同的擴(kuò)展。C++的面向?qū)ο蠛蚸ava不完全相同,javascript和他們也不完全相同。
2、對(duì)于java程序員需要知道javascript里的對(duì)象和java里所談的對(duì)象(實(shí)例)有很大不同。
3、函數(shù)也是對(duì)象,是可以作為構(gòu)造器的對(duì)象,是可以產(chǎn)生對(duì)象的對(duì)象。因?yàn)閖avascript里所謂對(duì)象就是指屬性的無(wú)序集合。函數(shù)可以添加屬性,所以也是對(duì)象。
4、進(jìn)一步了解new和prototype的定義。
5、 再對(duì)java程序員說(shuō)一句,對(duì)象,在javascript里非函數(shù)的對(duì)象,最類似java里的對(duì)象(實(shí)例),java里對(duì)象有屬性,有方法,在 javascript里對(duì)象只有屬性,所謂的方法就是函數(shù)類型的屬性,引用一般屬性可以寫(xiě)成o.x,也可以寫(xiě)成o["x"],使用對(duì)象的方法也同樣o.f ()可以,o["f"]()也可以。另外你所引用的對(duì)象的屬性可以是對(duì)象本身的屬性,也可以是該對(duì)象的構(gòu)造函數(shù)的原型的屬性。
6、我以前總是對(duì)照java來(lái)理解javascript,但現(xiàn)在看理解了C++或C的函數(shù)指針的概念,將javascript類比C或C++似乎更自然些。
具體一點(diǎn)說(shuō):
對(duì) 某函數(shù)對(duì)象比如Foo執(zhí)行new操作時(shí),首先會(huì)生成一個(gè)新對(duì)象,一個(gè)非函數(shù)類型的對(duì)象,然后執(zhí)行Foo,在Foo的函數(shù)體中,this代指新創(chuàng)建的函數(shù), 這種操作稱為將函數(shù)作為構(gòu)造器(constructor)使用,接著還會(huì)將該對(duì)象與Foo的原型(Prototype)建立聯(lián)系。
var Foo = function(){
this.x = "abc";
this.sayHello1 = function(){alert("hello你個(gè)頭!");}
};
Foo.sayHello2 = function(){alert("你hello個(gè)頭!");}
Foo.prototype.sayHello3 = function(){alert("你個(gè)頭hello!");}
var foo = new Foo;
foo.sayHello4 = function(){alert("暈!");};
foo.sayHello1();
//如果把Foo當(dāng)作類定義的話,sayHello2可以被理解為靜態(tài)方法
//但和java不同的是,foo.sayHello2();就會(huì)抱錯(cuò)。
Foo.sayHello2();
//在foo的屬性里并沒(méi)有sayHello3這個(gè)函數(shù)對(duì)象,但在foo的構(gòu)造函數(shù)的
//原型對(duì)象里有這個(gè)函數(shù)屬性,所以可以這么來(lái)調(diào)用,如果foo的構(gòu)造函數(shù)的
//原型對(duì)象里也沒(méi)這個(gè)屬性的話,就會(huì)到這個(gè)原型對(duì)象的構(gòu)造函數(shù)
//的原型對(duì)象里去找,以此類推。本例沒(méi)有體現(xiàn)這一點(diǎn),今天太晚了,
//下一篇里,我會(huì)在介紹javascript的幾個(gè)面向?qū)ο蟮膶?shí)現(xiàn)方式里寫(xiě)個(gè)這樣的例子。
foo.sayHello3();
foo.sayHello4();
foo["sayHello4"]();
alert(foo.x);
* Encapsulation(封裝) - Support for method calls on a Javascript object as a member of a Class.
* Polymorphism(多態(tài))- The ability for two classes to respond to the same (collection of) methods.
* Inheritance (繼承)- The ability to define the behavior of one object in terms of another by sub-classing.
在javascript里都可實(shí)現(xiàn)。
感覺(jué)對(duì)于理解javascript的面向?qū)ο筇匦裕羞@樣幾點(diǎn)需要注意,
1、將面向?qū)ο笞鳛橐粋€(gè)獨(dú)立的通用概念,面向?qū)ο笥胁煌膶?shí)現(xiàn)方式,也有不同的擴(kuò)展。C++的面向?qū)ο蠛蚸ava不完全相同,javascript和他們也不完全相同。
2、對(duì)于java程序員需要知道javascript里的對(duì)象和java里所談的對(duì)象(實(shí)例)有很大不同。
3、函數(shù)也是對(duì)象,是可以作為構(gòu)造器的對(duì)象,是可以產(chǎn)生對(duì)象的對(duì)象。因?yàn)閖avascript里所謂對(duì)象就是指屬性的無(wú)序集合。函數(shù)可以添加屬性,所以也是對(duì)象。
4、進(jìn)一步了解new和prototype的定義。
5、 再對(duì)java程序員說(shuō)一句,對(duì)象,在javascript里非函數(shù)的對(duì)象,最類似java里的對(duì)象(實(shí)例),java里對(duì)象有屬性,有方法,在 javascript里對(duì)象只有屬性,所謂的方法就是函數(shù)類型的屬性,引用一般屬性可以寫(xiě)成o.x,也可以寫(xiě)成o["x"],使用對(duì)象的方法也同樣o.f ()可以,o["f"]()也可以。另外你所引用的對(duì)象的屬性可以是對(duì)象本身的屬性,也可以是該對(duì)象的構(gòu)造函數(shù)的原型的屬性。
6、我以前總是對(duì)照java來(lái)理解javascript,但現(xiàn)在看理解了C++或C的函數(shù)指針的概念,將javascript類比C或C++似乎更自然些。
具體一點(diǎn)說(shuō):
對(duì) 某函數(shù)對(duì)象比如Foo執(zhí)行new操作時(shí),首先會(huì)生成一個(gè)新對(duì)象,一個(gè)非函數(shù)類型的對(duì)象,然后執(zhí)行Foo,在Foo的函數(shù)體中,this代指新創(chuàng)建的函數(shù), 這種操作稱為將函數(shù)作為構(gòu)造器(constructor)使用,接著還會(huì)將該對(duì)象與Foo的原型(Prototype)建立聯(lián)系。
var Foo = function(){
this.x = "abc";
this.sayHello1 = function(){alert("hello你個(gè)頭!");}
};
Foo.sayHello2 = function(){alert("你hello個(gè)頭!");}
Foo.prototype.sayHello3 = function(){alert("你個(gè)頭hello!");}
var foo = new Foo;
foo.sayHello4 = function(){alert("暈!");};
foo.sayHello1();
//如果把Foo當(dāng)作類定義的話,sayHello2可以被理解為靜態(tài)方法
//但和java不同的是,foo.sayHello2();就會(huì)抱錯(cuò)。
Foo.sayHello2();
//在foo的屬性里并沒(méi)有sayHello3這個(gè)函數(shù)對(duì)象,但在foo的構(gòu)造函數(shù)的
//原型對(duì)象里有這個(gè)函數(shù)屬性,所以可以這么來(lái)調(diào)用,如果foo的構(gòu)造函數(shù)的
//原型對(duì)象里也沒(méi)這個(gè)屬性的話,就會(huì)到這個(gè)原型對(duì)象的構(gòu)造函數(shù)
//的原型對(duì)象里去找,以此類推。本例沒(méi)有體現(xiàn)這一點(diǎn),今天太晚了,
//下一篇里,我會(huì)在介紹javascript的幾個(gè)面向?qū)ο蟮膶?shí)現(xiàn)方式里寫(xiě)個(gè)這樣的例子。
foo.sayHello3();
foo.sayHello4();
foo["sayHello4"]();
alert(foo.x);
?
posted on 2006-09-18 11:43 一農(nóng) 閱讀(402) 評(píng)論(0) 編輯 收藏 所屬分類: javascript