學習javascript的類物件導向特性;
1、對象直接量,其實就是直接定義一個多個值對的組合,例如:
var homer = {
name: "Homer Simpson",
age: 34,
married: true,
email: "homer@163.com"
}
2、對象的屬性:可以把一個值賦值給對象的一個新屬性來建立他,例如:
var book = new Object();
book.title = "Learn c#";
book.chapter1 = "class and object";
book.chapter1.page = 14;
這裡book原來只是一個Object類的對象,沒有任何的屬性,可是這裡通過指派陳述式就給他添加了title和chapter1兩個屬性,那麼在接下來的代碼中就可以開始使用這些屬性了。
注意,這裡還使用了屬性的嵌套;
這個特性應該算是比較神奇的,以前在別的語言中沒有見到過;
3、函數是儲存在變數中的值;可以通過把函數賦值給對象的一個屬性來定義個方法,比如:
// define a class Rectangle
function Rectangle(w,h)
{
this.Width = w;
this.Height = h;
}
//define a function
function compute_area()
{
return this.Width * this.Height;
}
//create a object
var page = new Rectangle(10,20);
//將函數賦值給對象的一個變數
page.area = compute_area;
//call the function through area;
var area = page.area();
當然了,下面這樣的定義會更加合理一些:
function Rectangle_resize(w,h){this.Height=h; this.Width =w;}
function Rectangle_enlarge(){ this.Height = this.Height*2; this.Width = this.Width*2}
function Rectangle(w,h)
{
this.Width = w;
this.Height = h;
this.resize = Rectangle_resize;
this.enlarge = Rectangle_enlarge;
}
4、原型對象(Prototype)
使用了遠行對象之後,javascript在表達方面才真正具有了物件導向的感覺;
由於原型對象的屬性被類的所有對象共用,所有他通常只用來定義類中所有對象的相同的屬性。這使得原型對象適用於定義方法和一些常量;(p144)
javascript採用的是以原型對象為基礎的繼承機制,而不是以類為基礎的繼承機制;所以在我們理解來看,他並不是真正的物件導向語言;
在javascript並沒有真正的類的概念,但是他通過建構函式和原型對象類比了類;所以我們可以用他來類比物件導向;
下面給出一個原型對象的例子:
//定義了一個建構函式
function Circle(r)
{
this.R =r;
}
//定義了一個類屬性
Circle.PI=3.14159;
//定義了一個類方法
Circle.max= function(a,b)
{
if (a.R>b.R)
return a
else
return b
}
//定義了一個對象方法Area
Circle.prototype=
{
Area:function(){
return Circle.PI* this.R*this.R;
}
}
//使用該類
var a = new Circle(10);
var b = new Circle(20);
alert(a.Area());
var c = Circle.max(a,b);
alert(c.R);
5、類的層次
一般來說,javascript中的類都是Object的直接子類,這是javascript所特有的。因為一般來說不需要太複雜的類層次體系;
但是有的時候我們可能還是會需要一些基層。
由於javascript的繼承體系是基於prototype的,所以我們要從prototype入手,假如我們要為上面的Circle添加一個子類,那麼只要讓AnotherCircle的prototype對象是Circle類的一個執行個體就可以了:
function AnotherCircle(r)
{
this.R = r;
}
AnotherCircle.prototype = new Circle(0);
AnotherCircle.prototype.constructor = AnotherCircle;
6、用數組的方式來訪文對象的屬性
例如對於上面的Circle類:
var c = new Circle(1);
alert(c["R"]);
如果使用一個對象是採取的是這種形式,我們常常稱之為關聯陣列;