我們在生活中經常聽到對象兩個詞,那么對象到底是個 什么玩意啦,我們來查一查維基百科;

百度給出的答案太玄乎了,我們這里只討論編程語言的對象,準確的說是JavaScript的對象;
**理解對象**
引用類型的值(對象)是引用類型的一個實例。在Js中,引用類型是一種數據結構,用于將數據和功能組織在一起。它有時被人稱之為類,但這種稱呼并不妥當。盡管JS從技術上講是一門面向對象的語言,但它不具備傳統的面向對象語言所支持的類和接口等基本結構。引用類型有時候也被稱為對象定義,因為它們描述的是一類對象所具有的屬性和方法。
在Java語言里面,我們可以把類理解稱為是與現實世界中抽象出來的一種事物,比如人,而對象可以理解稱為是市類的一個具體載體,與現實生活中存在或者不存在的具體事物相互對應,比如男人,女人,人妖,人馬,妖人。在這里類與對象都是抽象的,只要對象比類的范圍更細,更具體就可以了,比如對象時一個男人,我們說這個類就可以叫做張三,李四等;
如前所述,對象是某個特定引用類型的實例。新對象是使用new操作符后跟一個構造函數來創建的。構造函數本身就是一個函數。
**搞對象前,先創建一個對象:**
**1.對象字面量。**
~~~
var person={
name:'張三',
age:22,
address:'天堂',
showPresent:function(){
alert(this.name+" "+this.age+" "+this.address);
}
};
person.showPresent(); //調用
~~~
**2.函數create創建(有的瀏覽器不支持少用為好)**
Object.create(proto [, propertiesObject ]) 是E5中提出的一種新的對象創建方式,第一個參數是要繼承的原型,如果不是一個子函數,可以傳一個null,第二個參數是對象的屬性描述符,這個參數是可選的
**3.構造函數模式**
~~~
function person(name,age,address){
this.name = name;
this.age = age;
this.address = address;
this.showPresent = function(){
alert(this.name+":"+this.age+":"+this.address);
}
}
var newPerson =new person('張三',22,'地獄');
alert(newPerson.showPresent());
~~~
構造函數的缺點:由于this指針在對象實例的時候發生改變指向新的實例。這時新實例的方法也要重新創建,如果n個實例就要n次重建相同的方法。于是讓我們來揭開原型模式吧
**4.原型模式**
~~~
function person(){};
person.prototype.name='張三';
person.prototype.age=18;
person.prototype.address='湖北';
person.prototype.showPresent=function(){
alert(this.name+":"+this.age+":"+this.address);
}
var newperson=new person();
newperson.showPresent();
~~~
理解原型:
既然有了對象,我們就需要去了解一下對象是怎么產生的,我們得去拜訪一下老丈人和丈母娘看看他們是怎么產生這個對象的;

深度理解原型模型很重要,
首先,每個函數都有一個prototype(原型)屬性,這個指針指向的就是person.prototype對象。而這個原型對象在默認的時候有一個屬性constructor,指向person,這個屬性可讀可寫。而當我們在實例化一個對象的時候,實例newperson除了具有構造函數定義的屬性和方法外(注意,只是構造函數中的),還有一個指向構造函數的原型的指針,ECMAScript管他叫[[prototype]],這樣實例化對象的時候,原型對象的方法并沒有在某個具體的實例中,因為原型沒有被實例。
所以這種模式定義的對象,在調用方法的時候過程:調用nnewperson.showPresent();.showPresent();先看實例中有沒有,有調之,無追蹤到原型,有調之,無出錯,調用失敗。
propertiesObject 參數的詳細解釋:(默認都為false)
**數據屬性**
- writable:是否可任意寫
- configurable:是否能夠刪除,是否能夠被修改
- enumerable:是否能用 for in 枚舉
- value:值
**訪問屬性:**
- get(): 訪問
- set(): 設置
屬性操作:一般情況下操作屬性直接使用obj.name=value;這種方式直接操作就好了,但是在遍歷循環的時候我們要使用
obj[name]=value;這種操作才能得到我們想要的結果,當然也可以使用get和set方法;刪除的屬性值的話我們可以使用delete obj.name;如果是檢測屬性的話我們可以直接 * in,也可以使用hasOwnproperty;他和in 的最大區別在于in 會去遍歷該對象的所有屬性,包括默認的,而hasOwnproperty只遍歷該對象本身創建的;propertyIsEnumerable是判斷該屬性是否可以被枚舉的;
~~~
<script type="text/javascript">
var cat=new Object();
cat.legs=4;
cat.name='奔馳';
'legs' in cat; //true
'aaa' in cat; //false
'toString' in cat; //true
cat.hasOwnProperty('legs'); //true
cat.hasOwnProperty('toString'); //fasle
cat.propertyIsEnumerable('legs'); //true
cat.propertyIsEnumerable('toString'); //fasle
</script>
~~~
- 前言
- javascript基礎與定義
- JavaScript變量
- JavaScript變量二(數據類型,Number,String,Object)
- JavaScript傳參的問題
- JavaScript基本類型和引用類型的值
- JavaScript執行環境及作用域
- JavaScript垃圾收集
- JavaScript和JQuery和angularjs操作select
- 搞對象前,你得先有對象
- JavaScript數組
- JavaScript運行原理解析
- Jquery和angularjs獲取check框選中的值小技巧
- JavaScript函數表達式
- JavaScript的閉包理解
- JavaScript BOM
- JavaScritpt的DOM初探之Node(一)
- 為什么說DOM操作很慢
- jQuery性能優化