面向對象語言中的對象 老是能聽到什麼基於對象, 面向對象. 什麼是對象, 如果有面向對象基礎的人可以無視了, 下麵舉個簡單的例子給大家講講面向對象中, 對象的定義, 這個是比較通用的, 不過對於JS來說不太一樣, 但是理解總是好的. 首先, 先有類型(Class), 這個類是指具有本質相同的一類事物
面向對象語言中的對象
老是能聽到什麼基於對象, 面向對象. 什麼是對象, 如果有面向對象基礎的人可以無視了, 下麵舉個簡單的例子給大家講講面向對象中, 對象的定義, 這個是比較通用的, 不過對於JS來說不太一樣, 但是理解總是好的.
首先, 先有類型(Class), 這個類是指具有本質相同的一類事物, 比如大自然中的, 動物類, 植物類, 岩石類, 他們在根本上面具有本質相同的特性, 類下麵也區分小的類, 比如同是動物類, 動物類裡面也可以有貓類, 狗類, 當然啦, 人類也是一種類, 而在編程中, 類就是這一類東西用代碼體現的一種抽象.
然後, 就有了對象(Object), 對象就是類中的一個個體, 比如人類中的一個人, 這就是對象, 再舉些例子, 比如貓類中一隻貓, 狗類裡面具體到個體的一隻狗, 都可以理解為對象, 在編程中, 對象就是類抽象出來的一個個體的實例.
可能上面說的有點晦澀, 但是久了就好理解了, 現在舉點更具體的例子, 老師這一個職業, 算是一類人, 也就是類, 而你最喜歡的那個老師就是這個類的對象, 說白了就是類有種包含關係, 人類裡面可以有男人類, 女人類, 也可以有教師類, 消防員類, 在日後的學習中, 大家也會知道, 這些小的類都可以稱之為人類的子類, 也可以說這些類繼承了人類, 而對象卻不具備這種特性, 它只是某個類抽象到個體之後的單個實例(也就是實際的例子), 比如一位老師, 一個消防員, 這都是對象.
JS中的對象
JS中對對象的描述也差不太多, 只是JS是一種基於對象的語言, 並不是完全意義上的面向對象, 想要實現JS的類, 應該是一種使用函數模擬的方式, 所以可以這麼說, JS中有模擬的類, 不存在真實意義上的類. 不過我們這裡不糾結類, 著重講對象.
上面說的讓大家對對象也有一定理解了, 那麼下麵給大家再加一個新的概念, 那就是屬性, 屬性是一個對象的一些特點, 比如拿人作為一個對象, 那麼人就有名字, 年齡, 身高, 體重這些特點, 這些特點也就是這個人作為一個對象的屬性. 所以現在我們知道了, 一個對象它是具有很多屬性的.
那麼概念性的東西差不多了, 現在我們開始著重用代碼講對象.
首先我們先創建出一個對象.
var person = {
name : "Jianwei",
age : 23,
gender : "male"
};
var peron大家都知道, 變數的聲明, 指向了一個對象, 對象的類型如上所示, {}中間用" : "分隔的屬性和屬性值, 通常我個人習慣稱之為鍵值對(key-value), 這裡面創建了一個對象, 這個對象共有三個屬性, name, age, gender, 屬性名, 也就是key, 這個key的類型沒有特殊的限制(可以是值, 可以是字元串, 甚至於可以是另一個對象), 但是會通過toString()方法自動轉化為字元串, 所以可以理解為key最後都會是一個字元串, 而value的類型沒有特殊的限定(可以是值, 可以是字元串, 對象等等). 要註意的是, 屬性是無序的, 所以聲明的時候不需要註意順序之類的.
對象創建方法
第一種, 使用{}包含鍵值對的方式創建對象(對象直接量).
var person = {
name : "Jianwei",
age : 23,
gender : "male"
profession : {
compang : "Oricle",
job : "iOS"
}
};
第二種, 使用new構造器關鍵字.
var person = new Object();
第三種, 使用Object.create()方法創建對象.
var person = Object.create({
name : "Jianwei",
age : 23,
gender : "male"
});
前兩個方式比較好理解, 最後的這種方式, 簡單介紹下, Object.create這個方法需要一個對象類型的參數, 創造出的對象的原型指向的就是這個參數, 這個參數是字面量對象, 原型指向的自然是Object.prototype了, 具體使用哪個, 要因地制宜.
對象屬性的訪問
對象的屬性一般通過兩種方式訪問, 最常見的是通過點方法來進行訪問, 也可以通過key索引的方式, 如上的代碼案例.
var person = {
name : "Jianwei",
age : 23,
gender : "male"
};
如果我想要為oerson的name屬性重新賦值, 那麼使用如下語句的實現效果是相同的.
person.name = "Jianwei Wang";
person["name"] = "Jianwei Wang";
對象的原型(prototype)
這裡我還是用不嚴謹的個人理解來給大家講, 這樣有助於大家理解, 當大家能夠理解我的看法, 再去查看嚴謹的理論, 我相信這樣的學習是更好令人消化的.
之前我們有講父類和子類, 就比如人類, 和教師類, 人類是教師類的父類(super class), 教師類是人類的子類, 所以人類具有的所有屬性, 教師類都繼承了下來, 比如姓名, 年紀, 教師類也可以有自己新的, 父類所沒有的屬性, 比如教過了多少學生, 帶過多少班級. 所以現在大家先給自己一個這樣的思想, 就是父類的不作特殊修飾的屬性, 子類都可以繼承.
現在我們再來看JS中的對象, 首先, 有兩種創建對象的方式, 上面說過了, 繼承也簡單的解釋了, 那麼很噁心的知識下麵是, 建議大家用一天的時間來理解.
每個JS對象(null除外, 其實它本來自己有一個類型的, 但是官方那邊修改之後發現, 大量的瀏覽器都出錯了, 所以當使用typeof的時候, null顯示的類型還是Object類型), 都和另一個對象相關聯, "另一個"對象就是原型.
通過直接量創建的對象都繼承自Object.prototype(這句代碼其實是對原型對象的引用).
var person = {
name : "Jianwei",
age : 23,
gender : "male"
};
那麼這個person對象繼承的就是Object.prototype, 如果這時候為其添加了一個屬性, 語句如下:
Object.prototype.hobby = "eat";
那麼這個時候, 也能夠從person上面訪問到hobby這個屬性, 也可以對hobby進行修改(能否修改會取決於一些條件, 我這段代碼是允許, 後面會講具體的設置方法).
通過關鍵字new和構造函數調用創建的對象的原型就是構造函數的prototype屬性的值.
function person(){
name : "Jianwei",
age : 23,
gender : "male"
};
var jianweiWang = new person();
那麼這個jianweiWang對象繼承的就是person.prototype, 如果這時候為其添加了一個屬性, 語句如下:
person.prototype.hobby = "eat";
那麼這個時候, 也能夠從jianweiWang上面訪問到hobby這個屬性, 也可以對hobby進行修改(能否修改會取決於一些條件, 我這段代碼是允許, 後面會講具體的設置方法).
這個繼承關係也可以稱之為原型鏈, jianweiWang繼承的是person.prototype, 再往上繼承的是Object.prototype, 所以如果Object.prototype上的屬性, 幾乎所有的對象都會有.
所以假如為一個對象的一個屬性賦值, 首先會順著原型鏈向上找, 如果整個原型鏈都沒有, 才會為這個對象添加一個屬性.
所有的繼承來的屬性並不是實際擁有了, 只是通過原型鏈獲取到了, 複製給了自己一份, 所以假如上面的例子.
jianweiWang.hobby = "run";
但是這個時候列印person.prototype.hobby, 結果還是"eat", 因為只是副本變了, 本身並不會變.