天天看點

JavaScript面向對象了解對象構造對象

了解對象

對象這個詞如雷貫耳,同樣出名的一句話:XXX語言中一切皆為對象!

對象究竟是什麼?什麼叫面向對象程式設計?

對象(object),台灣譯作物件,是面向對象(Object Oriented)中的術語,既表示客觀世界問題空間(Namespace)中的某個具體的事物,又表示軟體系統解空間中的基本元素。

在軟體系統中,對象具有唯一的辨別符,對象包括屬性(Properties)和方法(Methods),屬性就是需要記憶的資訊,方法就是對象能夠提供的服務。在面向對象(Object Oriented)的軟體中,對象(Object)是某一個類(Class)的執行個體(Instance)。 —— 維基百科

對象是從我們現實生活中抽象出來的一個概念,俗話說物以類聚,人以群分,我們也經常說有一類人,他們專業給隔壁家制造驚喜,也就是我們說的老王

這裡面就有兩個重要概念

  1. 類:無論是物以類聚,還是有一類人,這裡說的類并不是實際存在的事物,是一些特征、是一些規則等
  2. 老王:這是個實物,是現實存在,和類的關系就是符合類的描述

對應到計算機術語,類就是class,定義了一些特點(屬性 property)和行為(方法 method),比如說給隔壁制造驚喜的這類人有幾個特征

  1. 長相文質彬彬,為人和善
  2. 姓王

同時這些人還有技能(行為)

  1. 幫隔壁修下水道
  2. 親切問候對方兒子

封裝

剛才我們說的已經涉及到了對象的一個重要特性——封裝

以前我們可能會有這樣的描述

王一長相文質彬彬,為人和善,姓王,有技能幫隔壁修下水道、親切問候對方兒子
王二長相文質彬彬,為人和善,姓王,有技能幫隔壁修下水道、親切問候對方兒子
王三長相文質彬彬,為人和善,姓王,有技能幫隔壁修下水道、親切問候對方兒子
王四長相文質彬彬,為人和善,姓王,有技能幫隔壁修下水道、親切問候對方兒子
...
王百萬長相文質彬彬,為人和善,姓王,有技能幫隔壁修下水道、親切問候對方兒子      

有了對象的思想我們可以這樣說了,首先定義一類人

有那麼一類人
1. 長相文質彬彬,為人和善
2. 姓王
同時這些人還有技能(行為)
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);
    }
}