標籤:
ECMA-262定義的對象是:無序屬性的集合,其屬性可以包含基本值、對象或者函數
說白了就是把一組特定的變數和方法封裝起來
那麼我們先建立一個對象
var person=new Object();person.name="Sakura";person.age=22;person.job="前端開發";person.sayName=function(){ console.log(this.name); }//當一個變數被封裝在一個對象中時,這個變數就可以稱為該對象的一個屬性//同樣的,當一個函數被封裝在一個對象中時,這個函數就可以稱為該對象的一個方法
實際上這種寫法較為古老,所以我們可以用對象字面量的方法重寫一下
var person={ this.name="Sakura", this.age=22, this.job="前端開發", this.sayName=function(){ console.log(this.name); }}
這樣一個對象就被建立出來了,當我們需要調用對象的某個方法,或者擷取對象的某個屬性時,就可以用“.”號來調用
var a=person.name; //擷取對象的屬性console.log(a); //Sakura person.sayName(); //調用對象的方法
一般來說這樣建立的對象在某些情況下能滿足我們的一些需求,然而事實情況是我們可能在實際工作中需要建立大量的具有某些相同特徵(屬性或方法)的對象
這就涉及到了代碼的複用性,畢竟誰也不願意一遍一遍的寫重複的東西,所以聰明的程式員們發明了幾種可複用的對象建立方法】
1.原廠模式
原廠模式抽象了建立具體對象的過程,實際上就是一個封裝特定介面用來建立對象的函數
function createPeson(name,age,job){ var obj=new Object(); obj.name=name; obj.age=age; obj.job=job; obj.sayName=function(){ console.log(this.name); //要注意這裡的this代表obj,而非createPerson } return obj;}
這個createPerson就是Factory 方法,它接收三個參數,之後會在內部建立一個新的對象,並將屬性和方法初始化,最後返回出這個對象
var person_01=createPerson("Sakura",22,"前端開發");var person_02=createPerson("Misaka",20,"網頁設計");
這樣一來我們可以不用寫過多冗餘的代碼,僅僅用一個Factory 方法就可以建立更多不同的對象
凡事皆有但是,在之前我們用instanceof運算子來確定對象的類型,當時我們的代碼是這樣的
var abc=function(num){ return num+1;}console.log(abc instanceof Object); //一切皆對象console.log(abc instanceof Function); //Function類型的對象
我們注意到,abc函數既是Object又是Function,那麼我們可以認為函數abc是Function類型的Object
同理,一個數組就是Array類型的Object
然而我們以上建立的person_01是啥玩意?
沒錯他只是Object,假如我們工作中需要建立很多個原廠模式,基於這些Factory 方法又建立很多種不同的對象,那麼怎麼區分這些對象是什麼類型或者說是哪個Factory 方法建立的?
顯然instanceof並不能告訴我們答案
...
JavaScript學習總結--建立對象