了解對象
對象這個詞如雷貫耳,同樣出名的一句話:XXX語言中一切皆為對象!
對象究竟是什麼?什麼叫面向對象程式設計?
對象(object),台灣譯作物件,是面向對象(Object Oriented)中的術語,既表示客觀世界問題空間(Namespace)中的某個具體的事物,又表示軟體系統解空間中的基本元素。
在軟體系統中,對象具有唯一的辨別符,對象包括屬性(Properties)和方法(Methods),屬性就是需要記憶的資訊,方法就是對象能夠提供的服務。在面向對象(Object Oriented)的軟體中,對象(Object)是某一個類(Class)的執行個體(Instance)。 —— 維基百科
對象是從我們現實生活中抽象出來的一個概念,俗話說物以類聚,人以群分,我們也經常說有一類人,他們專業給隔壁家制造驚喜,也就是我們說的老王
這裡面就有兩個重要概念
- 類:無論是物以類聚,還是有一類人,這裡說的類并不是實際存在的事物,是一些特征、是一些規則等
- 老王:這是個實物,是現實存在,和類的關系就是符合類的描述
對應到計算機術語,類就是class,定義了一些特點(屬性 property)和行為(方法 method),比如說給隔壁制造驚喜的這類人有幾個特征
- 長相文質彬彬,為人和善
- 姓王
同時這些人還有技能(行為)
- 幫隔壁修下水道
- 親切問候對方兒子
封裝
剛才我們說的已經涉及到了對象的一個重要特性——封裝
以前我們可能會有這樣的描述
王一長相文質彬彬,為人和善,姓王,有技能幫隔壁修下水道、親切問候對方兒子
王二長相文質彬彬,為人和善,姓王,有技能幫隔壁修下水道、親切問候對方兒子
王三長相文質彬彬,為人和善,姓王,有技能幫隔壁修下水道、親切問候對方兒子
王四長相文質彬彬,為人和善,姓王,有技能幫隔壁修下水道、親切問候對方兒子
...
王百萬長相文質彬彬,為人和善,姓王,有技能幫隔壁修下水道、親切問候對方兒子
有了對象的思想我們可以這樣說了,首先定義一類人
有那麼一類人
1. 長相文質彬彬,為人和善
2. 姓王
同時這些人還有技能(行為)
1. 幫隔壁修下水道
2. 親切問候對方兒子
然後是執行個體化,也就是對号入座
王一是老王
王二是老王
...
王百萬是老王
也就是我們通過類來描述一套規則,其中包括
- 屬性
- 行為
對于這個類執行個體化出的對象,也就是副歌這個類描述的對象,不用去關心對象細節,我們認為符合類的描述,就會有類規定的屬性和方法,至于每個方法具體實作細節不去關注,比如老王怎麼給人修水管,我知道他有修水管的技能,然後用的時候讓他去修就好了(隻要不修我家的)
我們稱這種隐藏細節的特征叫做封裝
JavaScript 對象
因為JavaScript是基于原型(prototype)的,沒有類的概念(ES6有了,這個暫且不談),我們能接觸到的都是對象,真正做到了一切皆為對象
是以我們再說對象就有些模糊了,很多同學會搞混類型的對象和對象本身這個概念,我們在接下來的術語中不提對象,我們使用和Java類似的方式,友善了解
function People(name){
this.name = name;
this.printName = function(){
console.log(name);
};
}
這是一個函數,也是對象,我們稱之為
類
var p1 = new People('Byron');
p1是People類new出來的對象,我們稱之為
執行個體
類和執行個體的關系用我們碼農的專業眼光看起來是這樣的
類就是搬磚的模具,執行個體就是根據模具印出來的磚塊,一個模具可以印出(執行個體化)多個執行個體,每個執行個體都符合類的特征,這個例子和我們JavaScript中概念很像
在Java中類不能稱之為對象,如同
老王
是一個概念、規則的集合,但是在JavaScript中,本身沒有類的概念,我們需要用對象模拟出類,然後用類去建立對象
我們的例子中模具雖然是“類”,但同時也是個存在的實物,是個對象,我們為了友善了解,稱之為
類
Object
我們知道JavaScript有
null
、
undefined
number
boolean
string
五種簡單類型,
null
和
undefined
分别表示沒有聲明和聲明後沒有初始化的變量、對象,是兩個簡單的值,其餘三個有對應的包裝對象
Number
Boolean
String
其它的就都是
object
類型了,比如常用的
Array
Date
RegExp
等,我們最常用的
Function
也是個對象,雖然
typeof function(){}; // "function"
但是Function執行個體和其它類型的執行個體沒有什麼差別,都是對象,隻不過
typeof
操作符對其做了特殊處理
在JavaScript中使用對象很簡單,使用new操作符執行
Obejct
函數就可以建構一個最基本的對象
var obj = new Object();
我們稱new 調用的函數為構造函數,構造函數和普通函數差別僅僅在于是否使用了
new
來調用,它們的傳回值也會不同
所謂“構造函數”,就是專門用來生成“對象”的函數。它提供模闆,作為對象的基本結構。一個構造函數,可以生成多個對象,這些對象都有相同的結構
我們可以通過
.
來位對象添加屬性和方法
obj.name = 'Byron';
obj.printName = function(){
console.log(obj.name);
};
這麼寫比較麻煩,我們可以使用字面量來建立一個對象,下面的寫法和上面等價
var obj = {
name: 'Byron',
printNmae: function(){
console.log(obj.name);
}
}
構造對象
我們可以抛開類,使用字面量來構造一個對象
var obj1 = {
nick: 'Byron',
age: 20,
printName: function(){
console.log(obj1.nick);
}
}
var obj2 = {
nick: 'Casper',
age: 25,
printName: function(){
console.log(obj2.nick);
}
}