国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript——我理解的OOP

shiguibiao / 2779人閱讀

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

此篇文章是看完《 JavaScript程序設計》—— 第五章 函數這一篇有感而發,覺得自己作為新手,而JavaScript又作為自己學的第一門語言,對原型鏈、構造器、this等特性概念的理解掌握對面向對象這一編程思想的形成有重要意義,所以我會把自己的不那么準確但盡量準確的理解寫一寫。 作為屬性的函數 唔,就從5.5.2 作為屬性的函數這里說起吧~我會經常引用書里的原話,盡量去理解作者的含義。

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

將函數作為屬性的第二個理由是讓程序從面向過程轉向面向對象。例如,我們不一定要將函數看作對形狀執行操作,將函數存儲為形狀的屬性。將函數放在對象的內部,可以讓人們專注于這些函數,讓函數扮演對象行為的角色。

面向對象編程這詞兒相信很多人聽說過,啥是對象?!我沒有對象啊!亂說啥?好了,那我們就用JavaScript生成一個對象不就好了嘛~
        var firstGirlfriend = {
            // 屬性
            sex:"woman",
            behaviorA:function () {return ("漂亮")},
            behaviorB:function () {return ("前凸后翹")},
            skill:{first:"做家務",second:"按摩",thirdly:"PAPAPA"}
            // 方法
            behaviorC:function () {
                return ("我會:"+this.skill.first+" | "+this.skill.second+" | ")
            },
            test:function () {return this;}
        };
        alert(firstGirlfriend.behaviorC())                 // "我會:做家務 | 按摩 | "
        alert(firstGirlfriend.test()===firstGirlfriend)    // true
YEAH!!我有對象啦,嗯哼一看,臥槽廣大群眾義憤填膺了,TM的有妹子就不錯了還做家務!按摩!!最后那是神馬?哦,沒看見。咳咳,都說了自定義的妹子嘛~肯定得全能一些嘛~實際情況是,那些做家務、按摩這些技能樹肯定是我來點啦,妹子只負責貌美如花就OK了~blablabla~ 這里先給個結論,不是很準確,關于this我會另開一篇文章談我的理解:

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

在函數內,this引用根據函數調用方式不同而有所不同。

接收方對象:通過點運算符或中括號運算符調用對象的方法時,在運算符左側所指定的對象。

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

回到咱們的"妹子"那兒,我想知道妹子有有什么技能,所以我用一個方法(behaviorC())讓她自己說出來,這時誰是接收方呢?沒錯,是妹子firstGirlfriend,妹子自己說自己會什么嘛,當然是她自己了,test()也證明了

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

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

想一想古代的皇帝,三宮六妾的,想想現在的一夫一妻制,哇哈哈,崩潰ing。那怎么辦,我想要更多的妹子啊:)(程序媛看到這里不要拉黑我,我只是想想而已),難道一個一個碼嗎?當然不會,所以我們寫一個函數來生成妹子
        var GirlfriendPlant = function (s) {
            return {
                sex:s,
                behaviorA:function () {return ("漂亮")},
                behaviorB:function () {return ("前凸后翹")},
                skill:{first:"做家務",second:"按摩",thirdly:"PAPAPA"},
                // 方法
                behaviorC:function () {
                    return ("我會:"+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 | 我會:做家務 | 按摩 | "));  // :)

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

這段代碼看上去沒問題,卻有一個嚴重缺陷,每次創建一個對象,都另行創建了額外的屬性、方法。在創建多個對象時,會浪費大量的內存來保存這些函數方法的冗余副本,這是很糟糕的事情,因為內存資源是有限的。當腳本耗盡內存就會崩潰。但是,我們還有一個方法來解決它們!
        // 工廠設置制造車間,protoMGP對象代表一個技能屬性坑齊全但是未命名未定制的妹子
        var protoMGP = {
            sex:undefined,
            behaviorA:function () {return ("漂亮")},
            behaviorB:function () {return ("前凸后翹")},
            skill:{first:undefined,second:undefined,thirdly:undefined},
            // 方法
            behaviorC:function () {
                alert("我會:"+this.skill.first+" | "+this.skill.second+" | "+this.skill.thirdly);
            }
        };
        // 工廠參數輸入車間
        var middleGirlPlant = function (sex,f,s,t) {
            // 獲得車間制造的妹子(對象),注意獲得的只是粗胚,為設置參數,但已經留好坑了
            var girlObj = Object.create(protoMGP);        
            // 開始定制妹子                
            girlObj.sex = sex;                            
            girlObj.skill.first = f;
            girlObj.skill.second = s;
            girlObj.skill.thirdly = t;
            // 返回定制好的妹子(對象)
            return girlObj;
        };  
        //現在開始制造妹子
        
        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"

看,我們的妹子不但滿足自定義屬性方法,并且這些屬性方法并不保存在每個妹子對象上,而是在她們的工廠中,只要需要隨時可以調用它們。(好吧這里實在抽象不起來了)

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

        // GirlA對象
        var GirlA = new highGirlfactory("woman");
        GirlA.behaviorA("Ax","Ay","Az");
        GirlA.behaviorB();                        // "我會:AxAyAz"
        // GirlB對象
        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

就不廢話了.....當你使用new操作符,就無需明確鏈接(Object.create)原型,也無需返回新創建的對象。當你在函數調用之前加上了new時,會發生什么?引自《JavaScript程序設計》《JavaScript編程全解》

調用構造函數new表達式的值是(被生成的)對象的引用。通過new表達式調用的構造函數內的this引用,引用了(被新生成的)對象。

見人說人話,見鬼說鬼話:)。【這里要注意的是,構造函數也是函數!所以它也可當普通函數使用喲(看最后代碼)】。我們調用new表達式后,會隱式生成一個新對象,但是對象不是賦值的,是引用的,所以說完就是生成了一個新對象的引用,代碼中就是var GirlA = new highGirlfactory("woman")將這個引用賦值給了變量GirlA。然后!構造函數里的(this引用)引用了新對象,嗯這樣斷句應該沒錯@_@,這里要提到一個之前沒說清楚的知識,this這個功能全稱叫this引用,我們為了形象點說指向。意思就是this指向的是新對象,接收方對象就是那個新生成的對象。so.......

這里先抄點板書,所有的函數(對象)都支持一種成為原型鏈的功能。使用原型鏈有兩個前提:

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

滿足上面后,便有了我們的原型鏈。其中對象對屬性的讀取(以及對方法的調用)是按照以下順序查找的:

對象自身的屬性

隱式鏈接所引用的對象(構造函數prototype對象)的屬性

上面的對象的隱式鏈接所引用的對象的屬性

反復按第三項的規則查找直至全部查找完畢,終點是Object.prototype對象。

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

關于Object.prototype我理解不是很深,到時也會在研究一下。

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

GirlA.__proto__===highGirlfactory.prototype

構造函數的prototype引用的對象里還有一個constructor屬性,這個東東引用的是構造函數,沒錯就是自己找自己。書中是這么寫的:

highGirlfactory.prototype.constructor===highGirlfactory


可以通過使用對象的constructor屬性來從對象處獲取其構造函數。如果能獲知對象的構造函數,也就能夠知道該對象的原型繼承情況了,于是便可以了解這個對象的一部分操作。

constructor屬性不是對象的之前屬性,而是通過原型鏈查找到的屬性。

嗯,不懂~,先暫時理解為獲取構造函數吧(弄懂回來補充)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82952.html

相關文章

  • Javascript OOP -- 深入理解函數

    摘要:寫在前面寫這篇文章計劃想了很久,終于付諸行動。此時所指向的空間變成了一個,因為在中函數名相同的后面的會覆蓋前面。特別注意函數的傳入參數與調用無關如果調用傳入兩個參數,而形參只有一個,就只會匹配一個參數。 寫在前面 : 寫這篇文章計劃想了很久,終于付諸行動。一直不知道該從哪里寫,或許文章有錯誤的地方,如果您發現了文章的錯誤,請指正!謝謝!好句欣賞:人生為棋,我愿為卒行動雖慢可誰曾見我退后...

    CollinPeng 評論0 收藏0
  • 【譯】每個JavaScript 開發者應該了解10個面試題

    摘要:避免脆弱的基類問題。紅牌警告沒有提到上述任何問題。單向數據流意味著模型是單一的事實來源。單向數據流是確定性的,而雙向綁定可能導致更難以遵循和理解的副作用。原文地址 1. 你能說出兩種對 JavaScript 應用開發者而言的編程范式嗎? 希望聽到: 2. 什么是函數編程? 希望聽到: 3. 類繼承和原型繼承的不同? 希望聽到 4. 函數式編程和面向對象編程的優缺點? ...

    mykurisu 評論0 收藏0
  • 用函數式編程對JavaScript進行斷舍離

    摘要:函數式編程一開始我并不理解。漸漸地,我熟練掌握了使用函數式的方法去編程。但是自從學習了函數式編程,我將循環都改成了使用和來實現。只有數據和函數,而且因為函數沒有和對象綁定,更加容易復用。在函數式的中,這些問題不復存在。 譯者按: 當從業20的JavaScript老司機學會函數式編程時,他扔掉了90%的特性,也不用面向對象了,最后發現了真愛啊!!! 原文: How I rediscov...

    dkzwm 評論0 收藏0
  • 淺談 OOP JavaScript [完結章] -- 繼承

    摘要:構造函數通過原型繼承了構造函數和原型,這就形成了一個鏈條,通俗的講就是原型鏈繼承。而且方法只能冒充構造函數里面的屬性和方法而無法冒充原型對象里面的屬性和方法還有最大的問題就是重復使用。 前言: 寫到這里,差不多就把OOP完結了,寫了幾篇OOP的文章,但是只是略懂皮毛,可能深入的OOP還有很多,但是我感覺寫到這里也算是差不多完結了。 繼承 繼承是面向對象比較核心的概念,其他語言可能實現...

    張利勇 評論0 收藏0
  • 關于 FP 和 OOP 區別不成熟想法

    摘要:前面一段時間對和兩者的關系感到比較困惑我使用的動態語言揉合太多范式在這一點上很難做出明確透徹的區分不過經過這段時間琢磨相對之前感覺要好一些了有了一些自己的想法后面自己的部分會有不少沒有驗證的地方所以應該當成感想來看需要說明我的經驗來自動態語 前面一段時間對 FP 和 OOP 兩者的關系感到比較困惑 我使用的動態語言揉合太多范式, 在這一點上很難做出明確透徹的區分 不過經過這段時間琢磨相...

    thekingisalwaysluc 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<