為什么叫類的模仿,因為JS中沒有類的概念适篙,也就是沒有class這個東東往核,畢竟是為了趕時髦才加上java這個詞的,跟java可是一點關(guān)系沒有嚷节,也沒有java中典型的class的概念聂儒,但是作為一門強大的腳本語言如何去面向?qū)ο竽兀蔷褪抢脴?gòu)造函數(shù)模仿類的功能
1硫痰、工廠模式創(chuàng)建對象
這是最原始的創(chuàng)建對象的方法衩婚,原理也很簡單,就是封裝了一個返回值為對象的函數(shù)
function createObject(name,age){
var o = new Object();
o.name = name;
o.age = age;
o.sayName = function(){
alert(this.name);
}
return o;
}
var person1 = createObject('小明','18');
person1.sayName();
var person2 = createObject('小紅','17');
person2.sayName();
這樣就能通過函數(shù)createObject不斷的創(chuàng)建對象了碍论,但是谅猾,我們想模仿的是類的概念,但是這里所創(chuàng)建的每一個對象都沒有辦法識別是什么類型,看下面代碼:
alert(person1 instanceof Object); //true
alert(person2 instanceof Object); //true
這里創(chuàng)建出來的變量person1和person2都是Object類型的税娜,并不符合面向?qū)ο罄锩娴?分類'的概念坐搔,比如我想讓創(chuàng)建出來的對象都屬于一個范疇的,就拿這里的person1和person2來說敬矩,這兩個對象應該都屬于人的范圍概行,應該有一個代表人的類型來專門給他們分類,為了解決這個問題弧岳,就有了第二種方法:
2凳忙、構(gòu)造函數(shù)創(chuàng)建對象
通過一個構(gòu)造函數(shù)來創(chuàng)建對象
function person(name,age){
this.name = name;
this.age = age;
this.sayName = function(){
alert(this.name);
}
}
person1 = new person('小明',18);
person2 = new person('小紅',17);
person1.sayName(); //小明
person2.sayName(); //小紅
這種方法很好的解決了對象識別的問題,如下代碼:
alert(person1 instanceof Object); //true
alert(person1 instanceof person); //true
alert(person2 instanceof Object); //true
alert(person2 instanceof person); //true
會發(fā)現(xiàn)person1和person2不僅是object類型的實例禽炬,還都是person類型的實例
構(gòu)造函數(shù)方法創(chuàng)建對象能夠滿足最基本“類的模仿”涧卵,但嚴格來說還有很多問題,比如這里用構(gòu)造函數(shù)每創(chuàng)建一個對象就要單獨開辟一塊內(nèi)存空間腹尖,但實際上對象里的很多屬性常常是可以共用的柳恐,比如說這里的sayName方法,每個對象里都有這個方法热幔,為什么不在內(nèi)存空間里只開辟一塊地方存它乐设,然后讓所有對象都從這塊地方調(diào)用它呢,為了實現(xiàn)這個原理绎巨,就有了原型的使用近尚。
3、JS中的原型
未完待續(xù)~