03_JS面向?qū)ο?/h1>

知識點

  • 面向?qū)ο蟮娜筇匦?/li>
  • 封裝
  • 繼承
  • 多態(tài)
  • 創(chuàng)建對象的幾種方式
  • 字面量形式
  • 使用內(nèi)置構(gòu)造函數(shù)
  • 封裝簡單的工廠函數(shù)
  • 自定義構(gòu)造函數(shù)
  • 構(gòu)造函數(shù)
  • 什么是構(gòu)造函數(shù)?
  • 對象的創(chuàng)建過程
  • 構(gòu)造函數(shù)的返回值
  • 對象是無序的鍵值對兒的集合
  • 如果像使用正常的函數(shù)一樣使用構(gòu)造函數(shù)
  • 獲取對象類型

面向?qū)ο蟮娜筇匦?/h1>

封裝

對象是將數(shù)據(jù)與功能組合到一起, 即封裝

  • js 對象就是 鍵值對的集合
  • 鍵值如果是數(shù)據(jù)( 基本數(shù)據(jù), 復(fù)合數(shù)據(jù), 空數(shù)據(jù) ), 就稱為屬性
  • 如果鍵值是函數(shù), 那么就稱為方法
  • 對象就是將屬性與方法封裝起來
  • 方法是將過程封裝起來
  //封裝
        var name = "張學(xué)友";
        var age = 18;

        function sayHello(){
            console.log("hello world");
        }
        var obj = {
            name : "劉德華",
            age : 50,
            sayHello : function () {
                //.....
            }
        }
        var itcast = {
            getEle:{

            },
        }

繼承

所謂繼承就是自己沒有, 別人有,拿過來為自己所用, 并成為自己的東西
讓某個類型的對象獲得另一個類型的對象的屬性的方法

  • js 繼承基于對象
  • 在JavaScript中,繼承就是當(dāng)前對象可以使用其他對象的方法和屬性悴晰。
  • js繼承實現(xiàn)舉例:混入(mix)
function mix ( o1, o2 ) {
    for ( var k in o2 ) {
        o1[ k ] = o2[ k ];
    }
}
<script>
        //繼承
        //javaScript當(dāng)中的繼承是指
        //一個對象沒有一些方法和屬性慢睡,但是另外一個對象有
        //把另外一個對象的屬性和方法逐工,拿過來使用,就是繼承

        var obj = {

        };

        var obj1 = {
            name : "張學(xué)友",
            sayHello: function () {
                console.log("你好漂辐,我是張學(xué)友");
            }
        }

//        obj.sayHello();

        //混入式繼承(mix-in)  for in
        for(var k in obj1){
            //k可以獲取到對象的每一個屬性
            //obj1[k]可以獲取到對象的每一個屬性的值
            //這里使用k給對象新增屬性的時候泪喊,不可以使用點語法
            obj[k] = obj1[k];
        }

        obj.sayHello();
    </script>

多態(tài)

  • 把不同的子類對象都當(dāng)作父類來看,可以屏蔽不同子類對象之間的差異髓涯,寫出通用的代碼袒啼,做出通用的編程,以適應(yīng)需求的不斷變化纬纪。
  • 多態(tài)是在強類型語言中比較常用蚓再,JavaScript中沒有相應(yīng)的體現(xiàn)
  • 使用父類的引用(指針)指向子類的對象 就叫做多態(tài)
  • 使用多態(tài)來隱藏不同
動物 animal = new 子類(); // 子類:麻雀、狗包各、貓摘仅、豬、狐貍...
動物 animal = new 狗();
animal.叫();

創(chuàng)建對象的方式

  • 字面量形式
    只能創(chuàng)建一次對象问畅,復(fù)用性較差娃属,如果要創(chuàng)建多個對象,代碼冗余度太高
  var obj = {
            name:"演員",
            singer:"薛段子手",
            type:"流行"
        };
        var obj1 ={
            name:"吻別",
            singer:"張學(xué)友",
            type:"流行"
        }
  • 使用內(nèi)置構(gòu)造函數(shù)
    //使用內(nèi)置構(gòu)造函數(shù)
    var obj = new Object();
    obj.name = "一千個傷心的牛油";
    obj.singer = "張學(xué)友";
    obj.sing = function () {
        console.log("一千個傷心的牛油");
    }

    var obj2 = new Object();
    obj2.name = "一千個傷心的牧流";
    obj2.singer = "張學(xué)友";
    obj2.sing = function () {
        console.log("一千個傷心的牧流");
    }
  • 封裝簡單的工廠函數(shù)
    本質(zhì)還是內(nèi)置構(gòu)造函數(shù)护姆,已經(jīng)不推薦使用了
 function createSong(SingerName,SingName){
        var obj = new Object();
        obj.name = SingerName;
        obj.singer = SingName;
        obj.sing = function () {
            console.log("一千個傷心的牛油");
        }
        return obj;
    }
    var obj = createSong("一千個傷心的牛油","張學(xué)友");

自定義構(gòu)造函數(shù)

  • 什么是構(gòu)造函數(shù)?
  • 構(gòu)造函數(shù)其實也是函數(shù)矾端,但是通常用來初始化對象,并且和new關(guān)鍵字同時出現(xiàn)
  • new 是用來創(chuàng)建對象的卵皂,構(gòu)造函數(shù)是用來初始化對象的(給對象新增成員)
  • 構(gòu)造函數(shù)名秩铆,首字母要大寫!以示區(qū)分
<script type="text/javascript">
    //自定義構(gòu)造函數(shù)
    function Person(){
        //默認(rèn)隱含的操作灯变,把剛才用new新創(chuàng)建出來的對象賦值給this
        this.name = "美女";
        this.age = 45;
        this.sayPaPa = function () {
            console.log("啪啪");
        }
//        return 123;
        return [1,2];
    }
    var p = new Person();
    console.log(p);
    p.sayPaPa();
</script>
  • 對象的創(chuàng)建過程
function Person(name, age){
    this.name = name;
    this.age = age;
}
var p = new Person();

以上面這個p對象創(chuàng)建為例:

  • 首先使用new關(guān)鍵字創(chuàng)建對象豺旬,類似于使用{},這個時候創(chuàng)建出來的對象是一個"沒有任何成員"的對象。這里需要注意兩點:
    1柒凉, 使用new關(guān)鍵字創(chuàng)建的對象族阅,對象的類型就是創(chuàng)建這個對象使用的構(gòu)造函數(shù)的函數(shù)名
    2, 使用{}創(chuàng)建對象膝捞,對象的類型一定是Object坦刀,相當(dāng)于使用了new Object()

  • 使用構(gòu)造函數(shù)為其初始化成員
    1, 在構(gòu)造函數(shù)調(diào)用開始的時候蔬咬,有一個賦值操作鲤遥,也就是讓this = 剛創(chuàng)建出來的對象
    2, 在構(gòu)造函數(shù)中林艘,this就代表剛創(chuàng)建出來的對象

  • 在構(gòu)造函數(shù)中盖奈,利用對象的動態(tài)特性,為對象添加成員

  • 構(gòu)造函數(shù)的執(zhí)行過程

  1. 使用new關(guān)鍵字創(chuàng)建對象
  2. 調(diào)用構(gòu)造函數(shù)狐援,把新創(chuàng)建出來的對象賦值給構(gòu)造函數(shù)內(nèi)的this
  3. 在構(gòu)造函數(shù)內(nèi)使用this為新創(chuàng)建出來的對象新增成員
  4. 默認(rèn)返回新創(chuàng)建的這個對象 (普通的函數(shù)钢坦,如果不寫返回語句究孕,會返回undefined)
  • 構(gòu)造函數(shù)的返回值
  1. 如果不寫返回值,默認(rèn)返回的是新創(chuàng)建出來的對象 (一般都不會去寫這個return語句)
  2. 如果我們自己寫return語句 return的是空值(return;)爹凹,或者是基本類型的值或者null厨诸,都會默認(rèn)返回新創(chuàng)建出來的對象
  3. 如果返回的是object類型的值,將不會返回剛才新創(chuàng)建的對象禾酱,取而代之的是return后面的值
  • 對象是無序的鍵值對兒的集合
    function Animal(name, type, barkWay) {
        this.name = name;
        this.type = type;
        this.bark = barkWay;
    }
  • 如果像使用正常的函數(shù)一樣使用構(gòu)造函數(shù)
  • 構(gòu)造函數(shù)中的this將不再指向新創(chuàng)建出來的對象(因為根本就沒有創(chuàng)建對象)
  • 構(gòu)造函數(shù)中的this這個時候指向的就是window全局對象
  • 當(dāng)使用this給對象添加成員的時候微酬,全部都添加到了window上
            Animal("","",function () {
                console.log("我是函數(shù)");
            }); //這是一個錯誤的演示

            window.bark();
  • 獲取對象類型
  • typeof 對象實例,獲取的是object
            var dog = new Animal("大黃","BYD",function () {
                console.log("汪汪汪");
            });
            console.log(dog);
            var cat = new Animal("小花","BSM",function () {
                console.log("喵喵喵");
            });
            console.log(typeof cat);//object
  • js中提供了兩個方法來調(diào)用其他對象的方法:call颤陶、apply
  • 獲取具體類型的方式
            var typeStr = Object.prototype.toString.call(想獲取類型的對象)
            typeStr = typeStr.slice(8, -1);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末颗管,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滓走,更是在濱河造成了極大的恐慌忙上,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闲坎,死亡現(xiàn)場離奇詭異,居然都是意外死亡茬斧,警方通過查閱死者的電腦和手機腰懂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來项秉,“玉大人绣溜,你說我怎么就攤上這事÷Π” “怎么了怖喻?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岁诉。 經(jīng)常有香客問我锚沸,道長,這世上最難降的妖魔是什么涕癣? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任哗蜈,我火速辦了婚禮,結(jié)果婚禮上坠韩,老公的妹妹穿的比我還像新娘距潘。我一直安慰自己,他們只是感情好只搁,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布音比。 她就那樣靜靜地躺著,像睡著了一般氢惋。 火紅的嫁衣襯著肌膚如雪洞翩。 梳的紋絲不亂的頭發(fā)上稽犁,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音菱农,去河邊找鬼缭付。 笑死,一個胖子當(dāng)著我的面吹牛循未,可吹牛的內(nèi)容都是我干的陷猫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼的妖,長吁一口氣:“原來是場噩夢啊……” “哼绣檬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嫂粟,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤娇未,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后星虹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體零抬,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年宽涌,在試婚紗的時候發(fā)現(xiàn)自己被綠了平夜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡卸亮,死狀恐怖忽妒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兼贸,我是刑警寧澤段直,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站溶诞,受9級特大地震影響鸯檬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜螺垢,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一京闰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甩苛,春花似錦蹂楣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至墨林,卻和暖如春赁酝,著一層夾襖步出監(jiān)牢的瞬間犯祠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工酌呆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衡载,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓隙袁,卻偏偏與公主長得像痰娱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菩收,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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