/**
*在js中並不存在類,所以可以直接通過Object來建立對象,但是使用這種方式建立有一
*弊端:由於沒有類的約束,無法實現對象的重複利用,並且沒有一種規範約定,在操作時容易帶來問題。
*/
var person = new Object();
person.name = "octopus";
person.age = 25;
person.say = function(){
alert(this.name+","+this.age);
}
json:json就是js的對象,但是它省去了XML標籤,而是通過{}來完成對象的說明。
var person = {
name:"張三",
age:25,
say:function(){
alert(this.name+","+this.age);
}
}
//通過json依然可以建立對象數組,建立方式和js的數組一樣。
var ps = [
{name:"張三",age:25},
{name:"李四",age:26}
];
for(var i=0;i<ps.length;i++){
alert(ps[i].name);
}
/**
* 建立一組使用者,使用者的屬性有:
* name:String,age:int,friends:Array
* List<Person> ps = new ArrayList<Person>();
* ps.add(new Person("張三",25,["Ada","Alice"]));
* ps.add(new Person("李四",26,["Ada","Chris"]));
* 把ps轉換為json
*/
ps = [
{
name:"張三",
age:25,
friends:["Ada","Alice"]
},
{
name:"李四",
age:26,
friends:["Ada","Chris"]
}
];
//通過工廠的方式來建立對象
function createPerson(name,age){
var o = new Object();
o.name = this.name;
o.age = this.age;
o.say = function(){
alert(this.name+":"+this.age);
}
return o;
}
//使用工廠的方式,雖然有效地解決了類的問題,但是也存在另一個問題:
//我們無法檢測對象p1和p2的具體資料類型,用typeof p1/p2 得到的只能是Object。
var p1 = createPerson("Ada",21);
var p2 = createPerson("Leon",23);
p1.say(); //Ada:21
p2.say(); //Leon:23
/**
* 通過建構函式的方式建立,和基於工廠的建立方式類似,
* 最大的區別就是函數的名稱就是類的名稱,按照Java約定,第一個字母大寫,
* 使用建構函式建立時,在函數內部是通過this關鍵字來完成屬性的定義。
*/
function Person(name,age){
this.name = name;
this.age = age;
//這種方式帶來的問題是所有的Person對象都會為該行為分配空間
this.say = function(){
alert(this.name+","+this.age);
}
}
//通過Person來建立對象
var p = new Person("octopus",24);
p.say(); //octopus,24
/**
* 使用建構函式的方式可以通過一下方式來檢測對象的類型
*/
alert(p1 instanceof Person); //true
alert(p1.say==p2.say); //false
/**但是上述建構函式也會帶來一些問題:
* 1.每一個對象中都會存在一個方法的拷貝,如果對象的行為很對的話,空間的佔有率就會大大增加
* 解決方案:可以將函數放到全域變數中定義,這樣可以讓類中的行為指向同一個函數。
*/
function Person(name,age){
this.name = name;
this.age = age;
//這種方式帶來的問題是所有的Person對象都會為該行為分配空間
this.say = say;
}
//將行為設定為全域的
function(){
alert(this.name+","+this.age);
}
alert(p1.say==p2.say); //true
//但是如果將行為設定為全域函數的時候,這個函數就可以被window調用,此時就破壞了對象的封裝性。
//而且如果很多類用全域的方式定義了大量的方法,容易造成混亂,也將不利於開發。
下節我們學慣用原型的方式建立對象。
原創文章如轉載,請註明出處,本文首發於csdn網站:http://blog.csdn.net/magneto7/article/details/24906045