js:對象的創建(為prototype做鋪墊)

/**
*在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 ps = new ArrayList();
* 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網站:https://blog.csdn.net/magneto7/article/details/24906045

You May Also Like