JS面向?qū)ο?-基礎(chǔ)知識(2)

面向?qū)ο蟮奶匦裕?/p>

  • 封裝
  • 繼承
  • 多態(tài)

封裝
作用:方便代碼的維護(hù),提高代碼的復(fù)用性锅睛,更安全的訪問數(shù)據(jù)的方式
注意:js中的封裝多了一層意思,就是使用對象來封裝變量和函數(shù)

繼承
現(xiàn)實(shí)生活中的繼承:繼承遺產(chǎn)历谍,一個(gè)人獲得另一個(gè)人所擁有的財(cái)富或者是資源的方式现拒。
編程語言中的繼承:一個(gè)類(對象)獲得另外一個(gè)類(對象)的屬性和方法的一種方式。

多態(tài)

  • 多種表現(xiàn)形態(tài):
    對于相同的操作望侈,不同的對象表現(xiàn)出不同的行為印蔬。

  • 實(shí)現(xiàn):
    js天生具備多態(tài)的特性(弱類型的語言)


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

  • 字面量法
    結(jié)構(gòu)
    var 對象 = {
    屬性名01:屬性值,
    屬性名02:屬性值脱衙,
    方法01:function(){函數(shù)體}
    }
    適用場合:只需簡單創(chuàng)建單個(gè)對象
    問題:如果需要?jiǎng)?chuàng)建多個(gè)相似的對象侥猬,那么代碼中冗余度太高(重復(fù)的代碼太多)
    代碼:
var book1 = {
        name:"悟空傳",
        author:"今何在",
        press:"湖南文藝出版社",
        price:"28.00",
        logDes:function(){
            console.log("書名:" + this.name + "作者:" + this.author);
        }
    }
  • 內(nèi)置構(gòu)造函數(shù)法
 var book1 = new Object();
    //01 設(shè)置屬性
    book1.name = "花田半畝";
    book1.author = "田維";
    book1.price = "40.01";

    //02 設(shè)置方法
    book1.logDes = function (){
        console.log("書名:" + this.name);
    }

問題:如果需要?jiǎng)?chuàng)建多個(gè)相似的對象例驹,那么代碼中冗余度太高(重復(fù)的代碼太多)

  • 工廠法
    對于內(nèi)置法把固定的部分提取寫成函數(shù)的函數(shù)體,把變化的部分提取退唠,作為參數(shù)傳遞
function createBook(name,author){
        //01 創(chuàng)建空的對象
        var o = new Object();
        //02 設(shè)置屬性和方法
        o.name = name;
        o.author = author;
        o.logDes = function(){
            console.log("作者是:" + this.author);
        }

        //04 返回新創(chuàng)建的對象
        return o;
    }

問題:如果創(chuàng)建多個(gè)不同類型的對象鹃锈,那么我們無法分辨

function createPerson(name,age){
        var o = new Object();
        o.name = name;
        o.age = age;
        return o;
    }

    function createDog(name,age)
    {
        var o = new Object();
        o.name = name;
        o.age = age;
        return o;
    }

    //創(chuàng)建具體的對象
    var obj1 = createPerson("張三",88);
    var obj2 = createDog("阿黃",6);

    
    console.log(obj1.constructor);  //Object
    console.log(obj2.constructor);  //Object

最終的返回值類型都是Object類型,只看結(jié)果不能夠準(zhǔn)確的辨認(rèn)obj1和obj2對應(yīng)的都是誰

  • 構(gòu)造法
    001 提供一個(gè)構(gòu)造函數(shù)
    002 通過this指針來設(shè)置屬性和方法
    003 通過new操作符創(chuàng)建對象
function Person(name,age){
        // 默認(rèn) 創(chuàng)建對象
        //var o = new Object();

        //默認(rèn)會賦值給this
        //this = o;

        // 01 通過this指針來設(shè)置屬性和方法
        this.name = name;
        this.age = age;
        this.showName = function(){
            console.log(this.name);
        };
        this.showAge = function(){
            console.log(this.age);
        }

        //默認(rèn)返回
        //return this;
    }

    //03 使用new操作符來創(chuàng)建對象
    var p1 = new Person("張三",20);
    var p2 = new Person("張老漢",200);
    console.log(p1);
    console.log(p2);

自定義構(gòu)造函數(shù)方式創(chuàng)建對象內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)
01 我們在使用new關(guān)鍵字調(diào)用構(gòu)造函數(shù)的時(shí)候,內(nèi)部默認(rèn)會創(chuàng)建一個(gè)空的對象
02 默認(rèn)會把這個(gè)空的對象賦值給this
03 通過this來設(shè)置新對象的屬性和方法
04 在構(gòu)造函數(shù)的最后瞧预,默認(rèn)會把新創(chuàng)建的對象返回

自定義構(gòu)造函數(shù)和工廠函數(shù)對比
001 函數(shù)的名稱不一樣屎债,構(gòu)造函數(shù)首字母大寫
002 自定義構(gòu)造函數(shù)創(chuàng)建方式內(nèi)部會自動(dòng)的創(chuàng)建空對象并且賦值給this
003 默認(rèn)會自動(dòng)返回新創(chuàng)建的對象

返回值
01 沒有顯示的return ,默認(rèn)會把新創(chuàng)建的對象返回
02 顯示的執(zhí)行了return語句,就得看具體的情況
001 返回的是值類型松蒜,那么直接忽略該返回扔茅,把新創(chuàng)建的對象返回
002 返回的是引用類型的數(shù)據(jù),會覆蓋掉新創(chuàng)建的對象秸苗,直接返回引用數(shù)據(jù)類型的值

function Dog(name)
        {
            this.name = name;
            //return "demo";  忽略
            return function (){console.log(name);};最終返回的值
        }

        var dog = new Dog("阿黃");
        console.log(dog);

        //function (){console.log(name) -->返回值

當(dāng)然這也不是自定義構(gòu)造函數(shù)的最終類型召娜,最終類型將在下面講解。


接下來的內(nèi)容均是建立在自定義構(gòu)造函數(shù)上的

instanceOf:判斷當(dāng)前對象是否是某個(gè)對象的實(shí)例

 function Person(){};
    function Dog(){};

 var p1 = new Person();
 var dog1 = new Dog();

 console.log(p1 instanceof Person);//true
 console.log(dog1 instanceof Dog);//true

constructor:構(gòu)造器屬性(獲染ァ)
console.log(p1.constructor);//function Person(){}

構(gòu)造函數(shù)原型對象

  • 原型對象:在使用構(gòu)造函數(shù)創(chuàng)建對象的時(shí)候玖瘸,默認(rèn)的會生成一個(gè)與之關(guān)聯(lián)的對象,這個(gè)對象就是原型對象檀咙。默認(rèn)情況下雅倒,該對象是一個(gè)空的對象({})

  • 原型對象的作用:使用構(gòu)造函數(shù)創(chuàng)建的對象,能夠自動(dòng)擁有原型對象中所有的屬性和方法

  • 如何訪問原型對象
    ① 構(gòu)造函數(shù).prototype
    ② 對象.__proto__

  • 如何設(shè)置原型對象
    ① 可以像設(shè)置普通對象一樣來利用對象的動(dòng)態(tài)特性設(shè)置屬性和方法
    ② 使用字面量的方法來設(shè)置原型對象(直接替換)

  • 約定
    正確的說法:該對象的構(gòu)造函數(shù)的原型對象
    構(gòu)造函數(shù)的原型
    構(gòu)造函數(shù)的原型對象
    對象的原型對象
    對象的原型
    以上四種說法弧可,她們的意思是一樣的蔑匣,都是該對象的構(gòu)造函數(shù)的原型對象

原型對象的屬性和方法的設(shè)置:
構(gòu)造函數(shù).prototype.屬性

實(shí)例化
通過構(gòu)造函數(shù)創(chuàng)建對象的過程,就叫做實(shí)例化

實(shí)例
通過構(gòu)造函數(shù)創(chuàng)建的對象被稱為該構(gòu)造函數(shù)的實(shí)例棕诵。一般在說實(shí)例的時(shí)候裁良,需要指定構(gòu)造函數(shù)。也就是說校套,我們通常會說這個(gè)對象是XXX構(gòu)造函數(shù)實(shí)例价脾。

 function Dog(){};
 Dog.prototype.des = "描寫信息";
 var dog = new Dog();

原型的使用方法
利用對象的動(dòng)態(tài)特性來設(shè)置原型對象

function Person(){
        this.name = "默認(rèn)的名稱";
    }

    //設(shè)置原型對象
    //成員= 屬性|方法
    //01 增加成員
    Person.prototype.des = "我是直立行走的人";
    Person.prototype.logName = function(){
        console.log(this.name);
    };

    //02 修改成員
    Person.prototype.des = "我是直立行走的人++++";
    //console.log(Person.prototype);

    var p1 = new Person();
    console.log(p1.des);
    p1.logName();

    //03 刪除成員
    //delete關(guān)鍵字
    //語法  delete 對象.屬性
    //console.log(delete p1.des);  //不能用這種方式刪除原型對象上面的屬性(刪除的是自己的屬性)

    delete Person.prototype.des ;
    console.log(p1.des);

替換原型對象(字面量)

注意點(diǎn):

  • 如果是替換了原型對象,那么在替換之前創(chuàng)建的對象和替換之后創(chuàng)建的對象她們指向的原型對象并不是同一個(gè)
  • 構(gòu)造器屬性:在替換之后創(chuàng)建的對象中笛匙,它的構(gòu)造器屬性指向的不是Person構(gòu)造函數(shù)侨把,而是Object的原型對象的構(gòu)造器屬性

建議
在設(shè)置完原型對象之后再統(tǒng)一的創(chuàng)建對象。

    function Person(){
        this.age = 40;
    }
    var p1 = new Person();
    Person.prototype.sayHi = function(){
        console.log("hi");
    };

    //設(shè)置原型對象
    Person.prototype = {
        name:"默認(rèn)的名稱",
        showName:function(){
            console.log(this.name);
        }
    };

    var p2 = new Person();

//    p1.sayHi();  //可以
//    p2.sayHi(); //不可以
//    console.log(p1.name);  //undefined
//    console.log(p2.name); //默認(rèn)的名稱
//    p1.showName();         //報(bào)錯(cuò)
//    p2.showName();         //默認(rèn)的名稱
    function Person(){
        this.age = 40;
    }
    var p1 = new Person();

    //var obj = new Object();
    Person.prototype = {
        //注意:如果替換了原型對象妹孙,那么需要在原型對象中修正構(gòu)造器屬性
        constructor:Person,//***
        sayHi:function (){
            console.log("hi");
        }
    };
    var p2 = new Person();
    //p2.constructor = Person;   //在p2對象上添加了一個(gè)屬性(constructor)

    //var p3 = new Person();


    //構(gòu)造器屬性
    console.log(p1.constructor == p2.constructor);  //如果不添加***所在句則false
//    console.log(p1.constructor);    //Person
//    console.log(p2.constructor);    //Object
//    console.log(p2.constructor == p2.__proto__.constructor);
//    console.log(p2.constructor == Object.prototype.constructor);

    console.log(p2);

構(gòu)造器:
屬性:constructor
值:與之關(guān)聯(lián)的構(gòu)造函數(shù)
注意點(diǎn):constructor是在原型對象身上的秋柄,我們通過對象.constructor訪問得到的值其實(shí)就是原型對象中對應(yīng)的值

暫時(shí)先更新到這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蠢正,隨后出現(xiàn)的幾起案子华匾,更是在濱河造成了極大的恐慌,老刑警劉巖机隙,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜘拉,死亡現(xiàn)場離奇詭異,居然都是意外死亡有鹿,警方通過查閱死者的電腦和手機(jī)旭旭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葱跋,“玉大人持寄,你說我怎么就攤上這事∮榘常” “怎么了稍味?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荠卷。 經(jīng)常有香客問我模庐,道長,這世上最難降的妖魔是什么油宜? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任掂碱,我火速辦了婚禮,結(jié)果婚禮上慎冤,老公的妹妹穿的比我還像新娘疼燥。我一直安慰自己,他們只是感情好蚁堤,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布醉者。 她就那樣靜靜地躺著,像睡著了一般披诗。 火紅的嫁衣襯著肌膚如雪撬即。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天藤巢,我揣著相機(jī)與錄音搞莺,去河邊找鬼。 笑死掂咒,一個(gè)胖子當(dāng)著我的面吹牛才沧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绍刮,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼温圆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孩革?” 一聲冷哼從身側(cè)響起岁歉,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膝蜈,沒想到半個(gè)月后锅移,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熔掺,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年非剃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了置逻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡备绽,死狀恐怖券坞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肺素,我是刑警寧澤恨锚,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站倍靡,受9級特大地震影響猴伶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜菌瘫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一蜗顽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雨让,春花似錦雇盖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庵寞,卻和暖如春狸相,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捐川。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工脓鹃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人古沥。 一個(gè)月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓瘸右,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岩齿。 傳聞我的和親對象是個(gè)殘疾皇子太颤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評論 2 361

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