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

來源:互聯網
上載者:User

/**
 *在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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.