添加屬性
當我們象上面那樣使用關鍵字new建立一個對象的時候,一個新的Object被建立了。我們可以在建立之後給這個對象添加屬性(就好像我在上面那樣添加屬性name。而接下來的問題就是如果我們建立了這個對象的另外一個執行個體,我們得象下面那樣再次給這個新對象添加這個屬性。)
Example DT3 (creates 3 ball objects)
CODE:
function Ball()
{
}
var ball0=new Ball(); // ball0 現在指向了類型Ball的一個新執行個體
ball0.name="ball-0"; // ball0 現在有一個屬性"name"
var ball1=new Ball();
ball1.name="ball-1";
var ball2=new Ball();
alert(ball0.name); // 輸出 "ball-0"
alert(ball1.name); // 輸出 "ball-1"
alert(ball2.name); // 哦,我忘記給ball2添加“name”了!
我忘記給ball2添加屬性name了,如果在正式的程式中這也許會引發問題。有什麼好辦法可以自動增加屬性呢?嗯,有一個:使用this關鍵字。this這個詞在function中有特別的意義。它指向了調用函數的那個對象。讓我們看看下面的另一個樣本,這時候我們在建構函式中添加上這些屬性:
Example DT4
CODE:
function Ball(message, specifiedName)
{
alert(message);
this.name=specifiedName;
}
var ball0=new Ball("creating new Ball", "Soccer Ball");
alert(ball0.name); // prints "Soccer Ball"
請記住:是new關鍵字最終使得建構函式被執行。在這個例子中,它將會運行Ball("creating new Ball", "Soccer Ball");而關鍵字this將指向ball0。
因此,這行:this.name=specifiedName變成了ball0.name="Soccer Ball"。
它主要是說:給ball0添加屬性name,屬性值是Soccer Ball。
我們現在只是添加了一個name屬性給ball0,看起來和上一個例子中所做的很象,但卻是一個更好更具擴充性的方法。現在,我們可以隨心所欲的建立許多帶有屬性的ball而無需我們手動添加它們。而且,人們也希望建立的Ball對象能夠清晰的看懂它的建構函式並且能夠輕鬆找出Ball的所有屬性。讓我們添加更多屬性到Ball裡。
Example DT5
CODE:
function Ball(color, specifiedName, owner, weight)
{
this.name=specifiedName;
this.color=color;
this.owner=owner;
this.weight=weigth;
}
var ball0=new Ball("black/white", "Soccer Ball", "John", 20);
var ball1=new Ball("gray", "Bowling Ball", "John", 30);
var ball2=new Ball("yellow", "Golf Ball", "John", 55);
var balloon=new Ball("red", "Balloon", "Pete", 10);
alert(ball0.name); // 輸出 "Soccer Ball"
alert(balloon.name); // 輸出 "Balloon"
alert(ball2.weight); // 輸出 "55"
嘿!使用物件導向術語,你能夠說Ball是一個擁有如下屬性的物件類型:name, color, owner, weight。
將對象賦給屬性
我們並沒被限制只能添加形如字串或者數字之類的單一資料型別作為屬性。我們也能夠將對象賦給屬性。下面,supervisor是Employee的一個屬性.
Example DT6
CODE:
function Employee(name, salary, mySupervisor)
{
this.name=name;
this.salary=salary;
this.supervisor=mySupervisor;
}
var boss=new Employee("John", 200);
var manager=new Employee("Joan", 50, boss);
var teamLeader=new Employee("Rose", 50, boss);
alert(manager.supervisor.name+" is the supervisor of "+manager.name);
alert(manager.name+"\'s supervisor is "+manager.supervisor.name);
會輸出什麼呢?
就像你在上面這個例子中看到的那樣,manager和teamLeader都有一個supervisor屬性,而這個屬性是類型Employee的一個對象。