JS高級——面向?qū)ο缶幊坛醪搅私?/h1>

帶你了解面向?qū)ο蠛兔嫦蜻^程的區(qū)別

講面向?qū)ο罅常碗x不開講一講面向過程。
面向?qū)ο蠛兔嫦蜻^程是現(xiàn)在編程的主要拌倍。
一赂鲤、面向過程簡述
面向過程:顧名思義噪径,當你處理一個事情的時候,它會按照過程逐步進行数初,著重于步驟找爱。
比如求一個循環(huán)數(shù)的和:

var num = 0;
for(var i = 0;i < 5;i++){
    sum += i;
}

這樣解決問題的代碼簡潔明了,關(guān)注的是解決問題的步驟即可泡孩,但是如果僅限于求和要求面向過程就足夠了缴允,因為邏輯簡單,不需要太過復(fù)雜的邏輯架構(gòu)去幫你理清解題思路珍德。
這是一個簡單的面向過程的例子,如果要再執(zhí)行一個循環(huán)六次的求和矗漾。就會如下代碼:

var num = 0;
for(var i = 0;i < 5;i++){
    sum += i;
}
for(var  i =0;i < 6;i++){
    sum += i;
}

那如果還要繼續(xù)執(zhí)行呢锈候?碰到了結(jié)構(gòu)復(fù)雜的程序,這個時候就發(fā)現(xiàn)重復(fù)的代碼過多敞贡,造成代碼冗余泵琳,而且如果寫多了,不利于思路條例誊役。
二获列、面向?qū)ο蠛喪?br> 1.面向?qū)ο螅好嫦驅(qū)ο蟮闹攸c在于對象,先創(chuàng)建一個對象然后借助對象的值屬性和方法來存儲數(shù)據(jù)以及解決問題蛔垢。
如同樣求一個循環(huán)數(shù)的和的代碼:

function  CreateAddtion (num){
    this.sum = 0; //求和最終結(jié)果
    this.count = num; //循環(huán)次數(shù)
    this.addtion = function (){
        for(var i = 0;i < this.count;i++){
              this.sum += i;
        }
        return this.sum;
    }
}
var add1 =new CreateAddtion(5);//5次和
var add2 = new  CreateAddtion(6);//6次和
console.log(add1.addtion());
console.log(add2.addtion());

面向?qū)ο蟮奶卣骶驮谟诨骱ⅲ岛徒鉀Q方案都交給對象存儲和處理,要想調(diào)用對象里的方法鹏漆,必須先聲明對象巩梢。當然在這個例子里,并不能突出面向?qū)ο蟮暮锰帯?br> 下面舉個例子艺玲,最經(jīng)常被拿來當教案的鴨子的故事為背景括蝠。

要求:模擬一個游戲,會出現(xiàn)多只鴨子饭聚,并且鴨子會游泳會叫忌警。鴨子分紅頭和綠頭鴨子。

面向過程:

//一下都是偽代碼,
//假設(shè)要2只鴨子
var yazi = function(){
      CreateYaZi();//創(chuàng)建鴨子
      Swin();  //游泳
      guagua() //呱呱叫
      red();  //在此處寫red();或者green()來修改紅頭鴨子和綠頭鴨子
      
}
//因為是兩只秒梳,以上代碼執(zhí)行for循環(huán)或者寫兩遍法绵。

面向?qū)ο?

//以下是偽代碼
function CreateYaZi (color){
       this.color  = color; //紅頭鴨子綠頭鴨子
       this.Swin = function (){
              //游泳
        }
        this.Guagua = function (){
              //叫
        }
}
var yazi1 = new CreateYaZi(red);
var yazi2 = new CreateYaZi(green);

在這個例子里,區(qū)別最大的在于紅綠頭鴨子端幼,如果用面向過程礼烈,每創(chuàng)建一個鴨子都需要程序員手動修改,但是如果用對象婆跑,直接根據(jù)傳遞的形參來給鴨子頭顏色賦值此熬,減少了代碼量,并且清晰了邏輯武契,如果還覺得這樣區(qū)別不大洁桌,可以增加要求叽赊,比如鴨子分為橡皮鴨佩微,紅綠頭鴨子枷遂,這兩種鴨子叫聲不一樣祥绞,橡皮鴨吱吱吱叫姓惑,紅綠頭鴨子嘎嘎嘎叫操灿,
這個時候程序員如果用面向過程的思想搀庶,就會去創(chuàng)建叫法不同的方法拐纱,分別給創(chuàng)建的鴨子賦值,而面向?qū)ο蟾缇螅恍枰膶ο蟮膶傩越占埽鶕?jù)屬性執(zhí)行相應(yīng)的函數(shù)即可。
由此可見的咆蒿,在大量的邏輯思維和需要后期維護大量需求的背景下东抹,使用面向?qū)ο笫谴蟠蠓奖懔顺绦騿T理清思路,并且減輕代碼量的沃测。
當然我個人覺得我舉這個例子也不大好缭黔,如果沒怎么理解,可以參考其他博客蒂破。
四馏谨、JS是基于對象的語言
1.什么樣的編程是面向?qū)ο蟮木幊蹋?br> (1)面向?qū)ο缶幊袒谑褂妹嫦驅(qū)ο笳Z言編程。
(2)具備的概念:類附迷、對象田巴。
(3)具備的特征:封裝、多態(tài)挟秤、繼承
(4)在創(chuàng)建對象時必須通過類創(chuàng)建壹哺。
批注:類是具有相同屬性和方法的集合,對象是類的實例化艘刚。

批注:封裝是把具體實現(xiàn)功能的代碼封裝成一個塊(方法)管宵,需要使用時調(diào)用方法即可。

批注:繼承是類和類之間一旦聲明了繼承關(guān)系攀甚,比如A繼承B也就是說A是B創(chuàng)建的子類箩朴。A子B父。子類必須繼承父類的所有方法秋度,并且可以選擇重寫父類的方法炸庞。

批注:多態(tài)是多個對象根據(jù)同一個類創(chuàng)建,同一個屬性值可能不同荚斯,同一個方法執(zhí)行的結(jié)果也可能不同埠居。

2.JS可以用面向?qū)ο缶幊虇幔?br> 可以查牌,但是并不完整。
(1)JS是基于對象的語言滥壕,它又具有面向過程語言的特點纸颜,又具有面向?qū)ο缶幊陶Z言的特點,但是雙方都不完善绎橘。
(2)JS沒有類和借口的概念胁孙,無法進行真正意義上通過類創(chuàng)建對象。
(3)JS可以用函數(shù)塊模擬面向?qū)ο筮^程的通過類創(chuàng)建對象称鳞,也就是說通過new類函數(shù)涮较,來創(chuàng)建對象,類函數(shù)中有相應(yīng)的屬性賦值和方法執(zhí)行冈止。

教你如何用JS創(chuàng)建對象

JS沒有類和接口的概念法希,只有方法,如果想用JS實現(xiàn)面向?qū)ο缶幊贪腥常梢杂梅椒M創(chuàng)建類的過程。

方法1:直接聲明創(chuàng)建實例

var Yazi ={
    name : '鴨子'毛肋,
    color : '紅頭'怨咪,
    swin : function(){//我會游泳},
    guaGua : function(){//我會呱呱叫}润匙,
};
console.log(Yazi.name);
console.log(Yazi.color);
Yazi.swin();
Yazi.guaGua();

方法2:調(diào)用工廠函數(shù)創(chuàng)建實例

function createYaZi (color){
                //創(chuàng)建一個對象
                var yazi = new Object();
                //或
                //var yazi = {};
                yazi.name = '鴨子';
                yazi.color = color;
                yazi.swin = function  () {
                    //我會游泳
                }
                yazi.guaGua = function  () {
                    //我會呱呱叫
                }
                return yazi;
}
var yazi1 =createYaZi('red');
console.log(yazi1);
console.log(yazi1 instanceof Object);
var yazi2 = createYaZi('green');
console.log(yazi2);
console.log(yazi1);

結(jié)果:


QQ20170823-195650@2x.png

或者

image.png

方法3:構(gòu)造函數(shù)(函數(shù)名的首字母大寫)

function CreateYaZi (color){            
                this.name = '鴨子';
                this.color = color;
                this.swin = function  () {
                    //我會游泳
                }
                this.guaGua = function  () {
                    //我會呱呱叫
                }
}
var yazi1 =new CreateYaZi('red');
console.log(yazi1);
console.log(yazi1 instanceof Object);
var yazi2 =new CreateYaZi('green');
console.log(yazi2);
console.log(yazi1);

結(jié)果:

image.png

方法4:通過原型創(chuàng)建方法(包含動態(tài)創(chuàng)建原型)
優(yōu)點:可以把共有的數(shù)據(jù)和方法統(tǒng)一存到 原型中诗眨,達到節(jié)約內(nèi)存的目的。

            function CreateYaZi (color){            
                CreateYaZi.prototype.name = '鴨子'; //共有的數(shù)據(jù)
                this.color = color;
                this.swin = function  () {
                    //我會游泳
                }
                                //這里是動態(tài)原型創(chuàng)建孕讳,如過原型中的方法和屬性已經(jīng)存在匠楚,就不會再對        
                                //其進行添加
                if (typeof(CreateYaZi.guaGua) != 'function') {
                    CreateYaZi.prototype.guaGua=function  () {
                        //我會呱呱叫
                    }
                }
}
var yazi1 =new CreateYaZi('red');
console.log(yazi1);
console.log(yazi1 instanceof Object);
var yazi2 =new CreateYaZi('green');
console.log(yazi2);
console.log(yazi1);

結(jié)果:

image.png

放在原型中的共有數(shù)據(jù)和方法都在實例化的對象的proto里,這個屬性最好不要修改厂财。

JS訪問對象屬性

訪問:
(1)對象名.屬性名 例如:yazi.name
(2)對象名[‘屬性名’] 例如 :yazi['name'] //這個方法不要有空格芋簿,否則可能影響檢索屬性的精準。

刪除:
delete yazi.name;

循環(huán)遍歷訪問對象
(1)for..in(遍歷下標)

for (var item in yazi) {
    if ((typeof yazi[item]) != 'function') {
                      //判斷鴨子獲取到的是否是方法璃饱,不是的話執(zhí)行輸出屬性值与斤。
            console.log(yazi[item]);
    }
}

(2)for..of(遍歷數(shù)據(jù))

for (var item of yazi) {
    if ((typeof yazi[item]) != 'function') {
                      //判斷鴨子獲取到的是否是方法,不是的話執(zhí)行輸出屬性值荚恶。
            console.log(yazi[item]);
    }
}

失敗的原因是因為對象只能通過下標和屬性名拿值撩穿。

刪除

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谒撼,隨后出現(xiàn)的幾起案子食寡,更是在濱河造成了極大的恐慌,老刑警劉巖廓潜,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抵皱,死亡現(xiàn)場離奇詭異善榛,居然都是意外死亡,警方通過查閱死者的電腦和手機叨叙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門锭弊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人擂错,你說我怎么就攤上這事味滞。” “怎么了钮呀?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵剑鞍,是天一觀的道長。 經(jīng)常有香客問我爽醋,道長蚁署,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任蚂四,我火速辦了婚禮光戈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘遂赠。我一直安慰自己久妆,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布跷睦。 她就那樣靜靜地躺著筷弦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抑诸。 梳的紋絲不亂的頭發(fā)上烂琴,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音蜕乡,去河邊找鬼奸绷。 笑死,一個胖子當著我的面吹牛层玲,可吹牛的內(nèi)容都是我干的健盒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼称簿,長吁一口氣:“原來是場噩夢啊……” “哼扣癣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起憨降,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤父虑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后授药,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體士嚎,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡呜魄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了莱衩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爵嗅。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖笨蚁,靈堂內(nèi)的尸體忽然破棺而出睹晒,到底是詐尸還是另有隱情,我是刑警寧澤括细,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布伪很,位于F島的核電站,受9級特大地震影響奋单,放射性物質(zhì)發(fā)生泄漏锉试。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一览濒、第九天 我趴在偏房一處隱蔽的房頂上張望呆盖。 院中可真熱鬧,春花似錦贷笛、人聲如沸应又。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杉允,卻和暖如春邑贴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叔磷。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工拢驾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人改基。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓繁疤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秕狰。 傳聞我的和親對象是個殘疾皇子稠腊,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容