成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript——我理解的OOP

shiguibiao / 2829人閱讀

摘要:所有的對(duì)象都含有一個(gè)隱藏的鏈接,用以指向在對(duì)象生成過(guò)程中所使用的構(gòu)造函數(shù)對(duì)象的對(duì)象。如果能獲知對(duì)象的構(gòu)造函數(shù),也就能夠知道該對(duì)象的原型繼承情況了,于是便可以了解這個(gè)對(duì)象的一部分操作。嗯,不懂,先暫時(shí)理解為獲取構(gòu)造函數(shù)吧弄懂回來(lái)補(bǔ)充

此篇文章是看完《 JavaScript程序設(shè)計(jì)》—— 第五章 函數(shù)這一篇有感而發(fā),覺(jué)得自己作為新手,而JavaScript又作為自己學(xué)的第一門(mén)語(yǔ)言,對(duì)原型鏈、構(gòu)造器、this等特性概念的理解掌握對(duì)面向?qū)ο筮@一編程思想的形成有重要意義,所以我會(huì)把自己的不那么準(zhǔn)確但盡量準(zhǔn)確的理解寫(xiě)一寫(xiě)。 作為屬性的函數(shù) 唔,就從5.5.2 作為屬性的函數(shù)這里說(shuō)起吧~我會(huì)經(jīng)常引用書(shū)里的原話(huà),盡量去理解作者的含義。

由于函數(shù)也是值,所以可以作為對(duì)象的屬性。把函數(shù)放在對(duì)象內(nèi)部有兩個(gè)主要理由第一個(gè)理由是把許多相關(guān)函數(shù)放在一組。把許多函數(shù)組合到單個(gè)對(duì)象中,有助于組織和理解大型程序。人類(lèi)不希望去嘗試?yán)斫庖粋€(gè)擁有數(shù)百個(gè)甚至數(shù)千個(gè)函數(shù)的系統(tǒng),如果一個(gè)系統(tǒng)只有數(shù)十個(gè)軟件組成部分,那我們理解起來(lái)會(huì)容易很多。例如,在一個(gè)游戲程序中,我們會(huì)很自然地為玩家、地貌、物理屬性、消息傳遞、裝備、圖像等分別創(chuàng)建出子系統(tǒng),每個(gè)都是一個(gè)很大的對(duì)象。

將函數(shù)作為屬性的第二個(gè)理由是讓程序從面向過(guò)程轉(zhuǎn)向面向?qū)ο?。例如,我們不一定要將函?shù)看作對(duì)形狀執(zhí)行操作,將函數(shù)存儲(chǔ)為形狀的屬性。將函數(shù)放在對(duì)象的內(nèi)部,可以讓人們專(zhuān)注于這些函數(shù),讓函數(shù)扮演對(duì)象行為的角色。

面向?qū)ο缶幊踢@詞兒相信很多人聽(tīng)說(shuō)過(guò),啥是對(duì)象?!我沒(méi)有對(duì)象??!亂說(shuō)啥?好了,那我們就用JavaScript生成一個(gè)對(duì)象不就好了嘛~
        var firstGirlfriend = {
            // 屬性
            sex:"woman",
            behaviorA:function () {return ("漂亮")},
            behaviorB:function () {return ("前凸后翹")},
            skill:{first:"做家務(wù)",second:"按摩",thirdly:"PAPAPA"}
            // 方法
            behaviorC:function () {
                return ("我會(huì):"+this.skill.first+" | "+this.skill.second+" | ")
            },
            test:function () {return this;}
        };
        alert(firstGirlfriend.behaviorC())                 // "我會(huì):做家務(wù) | 按摩 | "
        alert(firstGirlfriend.test()===firstGirlfriend)    // true
YEAH!!我有對(duì)象啦,嗯哼一看,臥槽廣大群眾義憤填膺了,TM的有妹子就不錯(cuò)了還做家務(wù)!按摩!!最后那是神馬?哦,沒(méi)看見(jiàn)。咳咳,都說(shuō)了自定義的妹子嘛~肯定得全能一些嘛~實(shí)際情況是,那些做家務(wù)、按摩這些技能樹(shù)肯定是我來(lái)點(diǎn)啦,妹子只負(fù)責(zé)貌美如花就OK了~blablabla~ 這里先給個(gè)結(jié)論,不是很準(zhǔn)確,關(guān)于this我會(huì)另開(kāi)一篇文章談我的理解:

在最外層代碼中,this引用的是全局對(duì)象。

在函數(shù)內(nèi),this引用根據(jù)函數(shù)調(diào)用方式不同而有所不同。

接收方對(duì)象:通過(guò)點(diǎn)運(yùn)算符或中括號(hào)運(yùn)算符調(diào)用對(duì)象的方法時(shí),在運(yùn)算符左側(cè)所指定的對(duì)象。

var obj = {
    x:3,
    doit:function () {alert("method is called."+this.x);}
};
obj.doit();            // 對(duì)象obj時(shí)接收方對(duì)象。doit是方法
obj["doit"]();         // 同上

回到咱們的"妹子"那兒,我想知道妹子有有什么技能,所以我用一個(gè)方法(behaviorC())讓她自己說(shuō)出來(lái),這時(shí)誰(shuí)是接收方呢?沒(méi)錯(cuò),是妹子firstGirlfriend,妹子自己說(shuō)自己會(huì)什么嘛,當(dāng)然是她自己了,test()也證明了

方法中,this.skill.first,先確定this引用的對(duì)象,然后讀取屬性值,最后成為全局函數(shù)alert的傳入值,被彈出。

好了大概知道this是什么我們就要繼續(xù)了。

想一想古代的皇帝,三宮六妾的,想想現(xiàn)在的一夫一妻制,哇哈哈,崩潰ing。那怎么辦,我想要更多的妹子啊:)(程序媛看到這里不要拉黑我,我只是想想而已),難道一個(gè)一個(gè)碼嗎?當(dāng)然不會(huì),所以我們寫(xiě)一個(gè)函數(shù)來(lái)生成妹子
        var GirlfriendPlant = function (s) {
            return {
                sex:s,
                behaviorA:function () {return ("漂亮")},
                behaviorB:function () {return ("前凸后翹")},
                skill:{first:"做家務(wù)",second:"按摩",thirdly:"PAPAPA"},
                // 方法
                behaviorC:function () {
                    return ("我會(huì):"+this.skill.first+" | "+this.skill.second+" | ")
                },
                test:function () {return this;}
            };
        };
           
        var girl_a = GirlfriendPlant("woman");
        var girl_b = GirlfriendPlant("man");
        alert(girl_a.behaviorB());            // "前凸后翹"
        alert(girl_b.sex+" | "+girl_b.behaviorC("man | 我會(huì):做家務(wù) | 按摩 | "));  // :)

瞧,是不是不用一個(gè)一個(gè)的寫(xiě)啦?而且我還高度定制了一些"功能",比如......咳咳,我是異性戀,但是男生力氣大做家務(wù)也快不是?
但是!還是有不足的地方,每個(gè)妹子出生就自帶這些技能和屬性了,可是有些妹子是不愿學(xué)習(xí)某些技能的,比如一些方法,一些屬性也不想表露出來(lái),怎么辦?

這段代碼看上去沒(méi)問(wèn)題,卻有一個(gè)嚴(yán)重缺陷,每次創(chuàng)建一個(gè)對(duì)象,都另行創(chuàng)建了額外的屬性、方法。在創(chuàng)建多個(gè)對(duì)象時(shí),會(huì)浪費(fèi)大量的內(nèi)存來(lái)保存這些函數(shù)方法的冗余副本,這是很糟糕的事情,因?yàn)閮?nèi)存資源是有限的。當(dāng)腳本耗盡內(nèi)存就會(huì)崩潰。但是,我們還有一個(gè)方法來(lái)解決它們!
        // 工廠(chǎng)設(shè)置制造車(chē)間,protoMGP對(duì)象代表一個(gè)技能屬性坑齊全但是未命名未定制的妹子
        var protoMGP = {
            sex:undefined,
            behaviorA:function () {return ("漂亮")},
            behaviorB:function () {return ("前凸后翹")},
            skill:{first:undefined,second:undefined,thirdly:undefined},
            // 方法
            behaviorC:function () {
                alert("我會(huì):"+this.skill.first+" | "+this.skill.second+" | "+this.skill.thirdly);
            }
        };
        // 工廠(chǎng)參數(shù)輸入車(chē)間
        var middleGirlPlant = function (sex,f,s,t) {
            // 獲得車(chē)間制造的妹子(對(duì)象),注意獲得的只是粗胚,為設(shè)置參數(shù),但已經(jīng)留好坑了
            var girlObj = Object.create(protoMGP);        
            // 開(kāi)始定制妹子                
            girlObj.sex = sex;                            
            girlObj.skill.first = f;
            girlObj.skill.second = s;
            girlObj.skill.thirdly = t;
            // 返回定制好的妹子(對(duì)象)
            return girlObj;
        };  
        //現(xiàn)在開(kāi)始制造妹子
        
        var gA = middleGirlPlant("woman","洗衣","做飯","LOL");
        console.log(gA.skill.first+" | "+gA.skill.second+" | "+gA.skill.thirdly);
        // "洗衣 | 做飯 | LOL"
        
        var gB = middleGirlPlant("man","Java","C","JavaScript");
        console.log(gB.skill.first+" | "+gB.skill.second+" | "+gB.skill.thirdly);            
        // "Java | C | JavaScript"

看,我們的妹子不但滿(mǎn)足自定義屬性方法,并且這些屬性方法并不保存在每個(gè)妹子對(duì)象上,而是在她們的工廠(chǎng)中,只要需要隨時(shí)可以調(diào)用它們。(好吧這里實(shí)在抽象不起來(lái)了)

每個(gè)通過(guò)middleGirlPlant創(chuàng)建的對(duì)象都有自己的sex、skillbehaviorA()、behaviorB()behaviorC()屬性,方法,這些屬性方法是由每個(gè)對(duì)象里的prototype引用的對(duì)象提供的,每個(gè)對(duì)象的隱藏鏈接都指向唯一共享原型,其中包含了上面所述的那些屬性方法。不過(guò)還有一個(gè)小小缺陷。我們使用了兩個(gè)全局變量middleGirlPlant、protoMGP。如果有一個(gè)就更好了,這樣我們的原型作為函數(shù)的一個(gè)屬性(對(duì)象)。接下來(lái),就是引出new這個(gè)構(gòu)造器了。
JavaScript中的每個(gè)函數(shù)對(duì)象都自動(dòng)包含一個(gè)prototype屬性,prototype是函數(shù)兩個(gè)預(yù)定義屬性中的第二個(gè),第一個(gè)length。只要函數(shù)一經(jīng)定義,它的prototype屬性就會(huì)被初始化為一個(gè)全新對(duì)象。(這個(gè)全新對(duì)象有自己的一個(gè)屬性,叫做constructor)。
        // 創(chuàng)建構(gòu)造函數(shù)highGirlfactory
        function highGirlfactory(s) {
            this.sex = s;
            var test = "哇哈哈,我有女朋友啦?。。?!";
            return test;
        };
        // 構(gòu)造函數(shù)的prototype(原型)
        highGirlfactory.prototype.behaviorA = function (a,b,c) {
            this.first = a;
            this.second = b;
            this.thirdly = c;
        };
        // 構(gòu)造函數(shù)的prototype(原型)
        highGirlfactory.prototype.behaviorB = function () {
            console.log("我會(huì):"+this.first+this.second+this.thirdly);
        };

        // GirlA對(duì)象
        var GirlA = new highGirlfactory("woman");
        GirlA.behaviorA("Ax","Ay","Az");
        GirlA.behaviorB();                        // "我會(huì):AxAyAz"
        // GirlB對(duì)象
        var GirlB = new highGirlfactory("woman");
        GirlB.sex = "SEX";
        console.log(GirlB.sex)                    // "SEX"
        // ---
        var Test = highGirlfactory();
        alert(Test);                              // "哇哈哈,我有女朋友啦?。。?!"
        // 原型鏈
        alert(highGirlfactory.prototype.constructor===highGirlfactory)    // true
        alert(GirlA.__proto__===highGirlfactory.prototype)                // true

就不廢話(huà)了.....當(dāng)你使用new操作符,就無(wú)需明確鏈接(Object.create)原型,也無(wú)需返回新創(chuàng)建的對(duì)象。當(dāng)你在函數(shù)調(diào)用之前加上了new時(shí),會(huì)發(fā)生什么?引自《JavaScript程序設(shè)計(jì)》《JavaScript編程全解》

調(diào)用構(gòu)造函數(shù)new表達(dá)式的值是(被生成的)對(duì)象的引用。通過(guò)new表達(dá)式調(diào)用的構(gòu)造函數(shù)內(nèi)的this引用,引用了(被新生成的)對(duì)象。

見(jiàn)人說(shuō)人話(huà),見(jiàn)鬼說(shuō)鬼話(huà):)?!?strong>這里要注意的是,構(gòu)造函數(shù)也是函數(shù)!所以它也可當(dāng)普通函數(shù)使用喲(看最后代碼)】。我們調(diào)用new表達(dá)式后,會(huì)隱式生成一個(gè)新對(duì)象,但是對(duì)象不是賦值的,是引用的,所以說(shuō)完就是生成了一個(gè)新對(duì)象的引用,代碼中就是var GirlA = new highGirlfactory("woman")將這個(gè)引用賦值給了變量GirlA。然后!構(gòu)造函數(shù)里的(this引用)引用了新對(duì)象,嗯這樣斷句應(yīng)該沒(méi)錯(cuò)@_@,這里要提到一個(gè)之前沒(méi)說(shuō)清楚的知識(shí),this這個(gè)功能全稱(chēng)叫this引用,我們?yōu)榱诵蜗簏c(diǎn)說(shuō)指向。意思就是this指向的是新對(duì)象,接收方對(duì)象就是那個(gè)新生成的對(duì)象。so.......

這里先抄點(diǎn)板書(shū),所有的函數(shù)(對(duì)象)都支持一種成為原型鏈的功能。使用原型鏈有兩個(gè)前提:

1. 所有的函數(shù)(對(duì)象)都具有名為prototype的屬性(這個(gè)屬性引用的對(duì)象成為prototype對(duì)象)。 2. 所有的對(duì)象都含有一個(gè)(隱藏的)鏈接,用以指向在對(duì)象生成過(guò)程中所使用的構(gòu)造函數(shù)(Function對(duì)象)的prototype對(duì)象。

滿(mǎn)足上面后,便有了我們的原型鏈。其中對(duì)象對(duì)屬性的讀?。ㄒ约皩?duì)方法的調(diào)用)是按照以下順序查找的:

對(duì)象自身的屬性

隱式鏈接所引用的對(duì)象(構(gòu)造函數(shù)prototype對(duì)象)的屬性

上面的對(duì)象的隱式鏈接所引用的對(duì)象的屬性

反復(fù)按第三項(xiàng)的規(guī)則查找直至全部查找完畢,終點(diǎn)是Object.prototype對(duì)象。

所以,我在 GirlB.sex = "SEX";這里重新創(chuàng)建一個(gè)鍵值對(duì),在console.log(GirlB.sex)時(shí),由于自身屬性就存在這個(gè)鍵值對(duì),不會(huì)在搜索到原型里的sex屬性。

關(guān)于Object.prototype我理解不是很深,到時(shí)也會(huì)在研究一下。

對(duì)于原型鏈(_proto_)這個(gè)玩意兒,他就是那個(gè)神秘的隱式鏈接,在new生成的新對(duì)象中,里面的_proto_引用的對(duì)象就是原型對(duì)象。

GirlA.__proto__===highGirlfactory.prototype

構(gòu)造函數(shù)的prototype引用的對(duì)象里還有一個(gè)constructor屬性,這個(gè)東東引用的是構(gòu)造函數(shù),沒(méi)錯(cuò)就是自己找自己。書(shū)中是這么寫(xiě)的:

highGirlfactory.prototype.constructor===highGirlfactory


可以通過(guò)使用對(duì)象的constructor屬性來(lái)從對(duì)象處獲取其構(gòu)造函數(shù)。如果能獲知對(duì)象的構(gòu)造函數(shù),也就能夠知道該對(duì)象的原型繼承情況了,于是便可以了解這個(gè)對(duì)象的一部分操作。

constructor屬性不是對(duì)象的之前屬性,而是通過(guò)原型鏈查找到的屬性。

嗯,不懂~,先暫時(shí)理解為獲取構(gòu)造函數(shù)吧(弄懂回來(lái)補(bǔ)充)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/82952.html

相關(guān)文章

  • Javascript OOP -- 深入理解函數(shù)

    摘要:寫(xiě)在前面寫(xiě)這篇文章計(jì)劃想了很久,終于付諸行動(dòng)。此時(shí)所指向的空間變成了一個(gè),因?yàn)樵谥泻瘮?shù)名相同的后面的會(huì)覆蓋前面。特別注意函數(shù)的傳入?yún)?shù)與調(diào)用無(wú)關(guān)如果調(diào)用傳入兩個(gè)參數(shù),而形參只有一個(gè),就只會(huì)匹配一個(gè)參數(shù)。 寫(xiě)在前面 : 寫(xiě)這篇文章計(jì)劃想了很久,終于付諸行動(dòng)。一直不知道該從哪里寫(xiě),或許文章有錯(cuò)誤的地方,如果您發(fā)現(xiàn)了文章的錯(cuò)誤,請(qǐng)指正!謝謝!好句欣賞:人生為棋,我愿為卒行動(dòng)雖慢可誰(shuí)曾見(jiàn)我退后...

    CollinPeng 評(píng)論0 收藏0
  • 【譯】每個(gè)JavaScript 開(kāi)發(fā)者應(yīng)該了解10個(gè)面試題

    摘要:避免脆弱的基類(lèi)問(wèn)題。紅牌警告沒(méi)有提到上述任何問(wèn)題。單向數(shù)據(jù)流意味著模型是單一的事實(shí)來(lái)源。單向數(shù)據(jù)流是確定性的,而雙向綁定可能導(dǎo)致更難以遵循和理解的副作用。原文地址 1. 你能說(shuō)出兩種對(duì) JavaScript 應(yīng)用開(kāi)發(fā)者而言的編程范式嗎? 希望聽(tīng)到: 2. 什么是函數(shù)編程? 希望聽(tīng)到: 3. 類(lèi)繼承和原型繼承的不同? 希望聽(tīng)到 4. 函數(shù)式編程和面向?qū)ο缶幊痰膬?yōu)缺點(diǎn)? ...

    mykurisu 評(píng)論0 收藏0
  • 用函數(shù)式編程對(duì)JavaScript進(jìn)行斷舍離

    摘要:函數(shù)式編程一開(kāi)始我并不理解。漸漸地,我熟練掌握了使用函數(shù)式的方法去編程。但是自從學(xué)習(xí)了函數(shù)式編程,我將循環(huán)都改成了使用和來(lái)實(shí)現(xiàn)。只有數(shù)據(jù)和函數(shù),而且因?yàn)楹瘮?shù)沒(méi)有和對(duì)象綁定,更加容易復(fù)用。在函數(shù)式的中,這些問(wèn)題不復(fù)存在。 譯者按: 當(dāng)從業(yè)20的JavaScript老司機(jī)學(xué)會(huì)函數(shù)式編程時(shí),他扔掉了90%的特性,也不用面向?qū)ο罅耍詈蟀l(fā)現(xiàn)了真愛(ài)?。。?! 原文: How I rediscov...

    dkzwm 評(píng)論0 收藏0
  • 淺談 OOP JavaScript [完結(jié)章] -- 繼承

    摘要:構(gòu)造函數(shù)通過(guò)原型繼承了構(gòu)造函數(shù)和原型,這就形成了一個(gè)鏈條,通俗的講就是原型鏈繼承。而且方法只能冒充構(gòu)造函數(shù)里面的屬性和方法而無(wú)法冒充原型對(duì)象里面的屬性和方法還有最大的問(wèn)題就是重復(fù)使用。 前言: 寫(xiě)到這里,差不多就把OOP完結(jié)了,寫(xiě)了幾篇OOP的文章,但是只是略懂皮毛,可能深入的OOP還有很多,但是我感覺(jué)寫(xiě)到這里也算是差不多完結(jié)了。 繼承 繼承是面向?qū)ο蟊容^核心的概念,其他語(yǔ)言可能實(shí)現(xiàn)...

    張利勇 評(píng)論0 收藏0
  • 關(guān)于 FP 和 OOP 區(qū)別不成熟想法

    摘要:前面一段時(shí)間對(duì)和兩者的關(guān)系感到比較困惑我使用的動(dòng)態(tài)語(yǔ)言揉合太多范式在這一點(diǎn)上很難做出明確透徹的區(qū)分不過(guò)經(jīng)過(guò)這段時(shí)間琢磨相對(duì)之前感覺(jué)要好一些了有了一些自己的想法后面自己的部分會(huì)有不少?zèng)]有驗(yàn)證的地方所以應(yīng)該當(dāng)成感想來(lái)看需要說(shuō)明我的經(jīng)驗(yàn)來(lái)自動(dòng)態(tài)語(yǔ) 前面一段時(shí)間對(duì) FP 和 OOP 兩者的關(guān)系感到比較困惑 我使用的動(dòng)態(tài)語(yǔ)言揉合太多范式, 在這一點(diǎn)上很難做出明確透徹的區(qū)分 不過(guò)經(jīng)過(guò)這段時(shí)間琢磨相...

    thekingisalwaysluc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<