(17.05.31)(48)面向?qū)ο?、類和實例、面向?qū)ο蟮奶卣?、工廠模式、繼承、類型的檢測

面向?qū)ο螅?/strong>
????思想。
????什么是對象:男朋友,女朋友,狗,貓,電視,冰箱 ......
????????什么都是對象 —— 萬物皆對象 (everything is object)。
????什么是面向?qū)ο螅?看著你的對象。和對象打交道。
????????—— 使用對象,創(chuàng)建對象

使用 —— 方便,好用 —— 以前
寫對象 —— $$$ ——現(xiàn)在


對象組成:
????屬性:某個物體(對象)具有的特性(人的身高,體重...)。
????????變量——有歸屬的變量。
????方法:某個對象會做什么事情(人會吃飯、睡覺...)。
????????函數(shù) —— 有歸屬的函數(shù)。
????事件:觸發(fā)這個對象的一些行為,這個對象給出的反應(yīng)。
????????在JS的面向?qū)ο罄?,方法和事件不做?yán)格區(qū)分(統(tǒng)一叫方法)

類和實例:
????類: 模板。 沒有什么具體的功能。
????????Date —— 類(本身也有一些功能)
????????var oDate = new Date(); // Date -> 類
????實例:根據(jù)模板造出來的具體的東西。
????????var oDate = new Date(); // oDate -> 實例

面向?qū)ο蟮奶卣鳎?/strong>
????封裝:把細(xì)節(jié)包起來,用戶只管使用,不用關(guān)心是怎么實現(xiàn)的。
????繼承:子類可以直接使用父類的功能(東西)
????多態(tài):在JS中沒有。


一、寫一個對象
????組成:屬性、方法

????一)屬性
????????弄一個對象,通過函數(shù):

           function Person(){
               1、弄一個空對象
                   let obj = new Object();
               2、把屬性放到對象身上
                   obj.name = name;
                   obj.age = age;
               3、返回對象
                   return obj;
           }

????????使用:

            //根據(jù)Person類實例化一個對象
            var p1 = Person('zhangsan',20);
            //訪問屬性
            p1.name
            pa.age

工廠模式:
????現(xiàn)實:
????????原料準(zhǔn)備 ———> 加工 ———> 出廠
????JS:
????????obj ———> obj.xxx = x ——> return obj;

系統(tǒng)中的類、對象: new
????var oDate = new Date();
????var reg = new RegExp();

咱們現(xiàn)在:函數(shù)調(diào)用
????var p1 = Person();

想通過 new 來得到一個對象:
????目標(biāo):var p1 = new Person();

  • 如果使用new,得到對象,new 做了一些事情,對Person的影響:
    1. 自動創(chuàng)建一個新的空白對象
    2. 把這個對象賦值給 this
    3. 自動返回 this

  • Person 實質(zhì)上就是一個函數(shù) —— 構(gòu)造函數(shù) (約定:首字母大寫)

  • 能 new 出來的東西,都是函數(shù) (Date, RegExp... Array,new Map()...)

  • new 一個類的實例時,構(gòu)造函數(shù)自動執(zhí)行。

函數(shù):
????new Function()

????以前:
????????function show(){}
????本質(zhì):
????????var show = new Function('');

Array:
????1、 var arr = [1,2,3];
????2、 var arr = new Array(1,2,3);

????如果只有一個參數(shù)(值):
????????arr=[3]; // 表示 一個元素,值是3
????????arr=new Array(3); //表示 三個元素,值是空 —— 長度


二)方法:
????每個一函數(shù)身上(每個類身上),有一個東西叫 原型, prototype, 類的方法就是放在原型身上。

    function Person(name,age){
        this.name = name;
        this.age = age;
    }
    //給Person類加一個顯示自己名字的方法
    Person.prototype.showName = function(){
        alert(this.name);
    };
  • 原型上的方法,屬于類,而不屬于實例。

  • 原型prototype 可以用于擴(kuò)展系統(tǒng)方法
    ????數(shù)組:
    ????????arr.indexOf(); //用法、作用 和 str.indexOf 一樣
    ????????????—— 只支持高級瀏覽器(ie7,8.. 不支持)

  • 擴(kuò)展系統(tǒng)方法時,原則: 能用系統(tǒng)的盡量用系統(tǒng)的

  • 關(guān)于瀏覽器判斷 —— 盡量少用 navigator.userAgent
    ????????(msie firefox chrome...)
    ????????????—— 建議使用支持的特性進(jìn)行判斷

上午回顧:

一、概念
    對象: 任何東西都是對象
    面向?qū)ο螅?和對象打交道
1、對象的組成:
    屬性:有歸屬的變量
    方法:有歸屬的函數(shù)
    事件:在JS的面向?qū)ο罄铮曂瑸榉椒?2、類、實例
    類:  模板,沒有實際的功能
    實例:根據(jù)模板(類)造出來的一個具體的東西

    function Person(){} —— Person 類
    let p1 = new Person(); —— p1 實例

    類 —— 實例化 ——實例
3、面向?qū)ο蟮娜齻€特性:
    封裝:包起來。用戶只管用,不關(guān)心內(nèi)部的具體實現(xiàn)。
    繼承:子類可以使用父類的東西
    多態(tài):JS中沒有

* 能new出來的,肯定是函數(shù)
* 任何東西都是對象
* new 一個類的實例時,這個類的構(gòu)造函數(shù)自動執(zhí)行
* 函數(shù)的本質(zhì):  new Function();
* Array 
    arr = [3]; //3 表示的 數(shù)組中有一個3
    arr = new Array(3);  //3 表示的是數(shù)組的長度

二、寫一個對象

    1、寫法
    //Person —— 構(gòu)造函數(shù)(約定:首字母大寫)
    //屬性 : 放到構(gòu)造函數(shù)里
    function Person(name,age){
        //給屬性賦值
        this.name = name;
        this.age = age;
    }
    //方法:放到原型身上
    Person.prototype.showName=function(){
        //return this.name;
        return '張先生';
    };
    Person.prototype.showAge = function(){};

    2、實例化
    
    let p1 = new Person('zhangsan',20);
        //p1.name = 'zhangsan'
        p1.showName() ——> 'zhangsan'
    let p2 = new Person('lisi',18);
        
* prototype: 原型
    可以擴(kuò)展系統(tǒng)方法:
        1、arr.indexOf
        //arr.indexOf = 
        Array.prototype.indexOf=
        2、str.trim —— 去除首尾空格
            String.prototype.trim = String.prototype.trim || function(){}

三、繼承
????子類可以使用父類的東西,父類有什么子類就有什么。

現(xiàn)在有一個類: Person —— 人
想有一個新類: Worker —— 工人

1、直接寫       ×
    function Worker(name,age,job){}...  
2、把Person改成 Worker , 不行, 原來對  Person 的調(diào)用都會報錯  ×
3、把Person復(fù)制一份,改個名  ×
4、繼承    √

父類到底有什么,或說 ,子類需要繼承什么:
????1. 屬性
????2. 方法

一) 屬性的繼承
????在子類的構(gòu)造函數(shù)里,調(diào)用了父級的構(gòu)造函數(shù):

        function Worker(name,age,job){
            Person(name,age);
            this.job = job;
        }
    以上寫法,Person中this 出問題了 ——>  指向了  Window

this的問題:
????有問題的地方:
????????1. 定時器
????????2. 箭頭函數(shù)里this 指向 父級作用域。
????解決:
????????1. 在this正確的地方,存一下, var _this = this;
????????2. call
????????????函數(shù)名.call(this的指向,參數(shù)1,參數(shù)2...);
????????3. apply
????????????函數(shù)名.apply(this的指向,[參數(shù)1,參數(shù)2...]);
????????4. bind:本身并不執(zhí)行函數(shù),只是完成this的綁定

            1)  let a = fn.bind(this的指向,參數(shù)1,參數(shù)2);
                a();
            2)  let a = fn.bind(this的指向,參數(shù)1);
                a(參數(shù)2);

屬性繼承:
????子類的構(gòu)造函數(shù)里,調(diào)用父類的構(gòu)造函數(shù), 注意this, call/apply

    function Person(){}
    function Worder(){
        Person.call(this,name.....);
        Person.apply(this,arguments);
    }

繼承:
1、父類所具有的東西,子類天然具有
2、子類修改了,不能影響父類
3、父類修改了,子類自動修改

二) 方法的繼承

????1、子類的原型 = 父類的原型????×
????????Worker.prototype = Person.prototype
????2、子類的原型 = new Person();???? //父類的實例 √


類型的檢測:

JS ,是一種弱類型的語言。

1、typeof
    基本類型    √
    對象類型 ——  object
2、instanceof
    檢測 某個對象是不是某個類的實例,一直向上檢查
    oDate instanceof Date   //true
3、constructor
    obj.constructor == Date
    某個對象的親爹是誰,到底是由誰構(gòu)造出來的。

=============2017年5月31日 星期三 16:43:30 =============
總結(jié): 寫一個類,帶繼承

    1、寫父類
        屬性:構(gòu)造函數(shù)里
        方法:原型上
    2、繼承
        屬性:
            在子類的構(gòu)造函數(shù)里,調(diào)用父類的構(gòu)造函數(shù)(注意this)
                function Worker(){
                    Person.apply(this,arguments);
                }
        方法:
            1.子類的原型 = 父級的一個實例
                Worker.prototype = new Person();
            2.糾正構(gòu)造函數(shù)
                Worker.prototype.constructor = Worker;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容