<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        JS中原型式和寄生式繼承的詳解(代碼示例)

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 19:29:29
        文檔

        JS中原型式和寄生式繼承的詳解(代碼示例)

        JS中原型式和寄生式繼承的詳解(代碼示例):本篇文章給大家?guī)淼膬?nèi)容是關(guān)于JS中原型式和寄生式繼承的詳解(代碼示例),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的
        推薦度:
        導(dǎo)讀JS中原型式和寄生式繼承的詳解(代碼示例):本篇文章給大家?guī)淼膬?nèi)容是關(guān)于JS中原型式和寄生式繼承的詳解(代碼示例),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的

        本篇文章給大家?guī)淼膬?nèi)容是關(guān)于JS中原型式和寄生式繼承的詳解(代碼示例),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。

        前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯(cuò)誤,會(huì)非常感謝您的指出。文中絕大部分內(nèi)容引用自《JavaScript高級(jí)程序設(shè)計(jì)第三版》。

        原型式繼承

        道格拉斯 克勞克福德在2006年寫了一篇文章,題為Prototypal Inhertitance in JavaScript(JavaScript中的原型式繼承)。

        在這篇文章中,他介紹了一種實(shí)現(xiàn)繼承的方法,這種方法并沒有使用嚴(yán)格意義上的構(gòu)造函數(shù)。

        他的想法是借助原型可以基于已有的對(duì)象創(chuàng)建新對(duì)象,同時(shí)還不必因此創(chuàng)建自定義類型。

        為了達(dá)到這個(gè)目的,他給出了如下函數(shù)。

        function object(o) {
         function F(){};
         F.prototype = o;
         return new F();
        }

        在object()函數(shù)內(nèi)部,先創(chuàng)建一個(gè)臨時(shí)性的構(gòu)造函數(shù),然后將傳入的對(duì)象作為這個(gè)構(gòu)造函數(shù)的原型,最后返回了這個(gè)臨時(shí)類型的一個(gè)新實(shí)例對(duì)象。

        從本質(zhì)上講,object()對(duì)傳入的對(duì)象執(zhí)行了一次淺復(fù)制。

        function object(o){
         function F(){};
         F.prototype = o;
         return new F();
        }
        
        var person = {
         name: "Shaw",
         friends: ["Sharon", "Sandy", "Van"]
        }
        
        var person1 = object(person);
        
        /*
        person1 = function object(person){
         function F(){};
         F.prototype = person1;
         return new F();
        }()
        
        person1 = function object({
         name: "Shaw",
         friends: ["Sharon", "Sandy", "Van"]
        }){
         function F(){};
         F.prototype = {
         name: "Shaw",
         friends: ["Sharon", "Sandy", "Van"]
         }
         return {
         }
        }
        
        person1 = {
        
        };
        
        {}.__proto__ = {
         name: "Shaw",
         friends: ["Sharon", "Sandy", "Van"]
        }
        */
        
        person1.name = "Roc";
        person1.friends.push("Roster");
        
        var person2 = object(person);
        
        person2.name = "Linda";
        person2.friends.push("Jobs");
        
        console.log(person.friends); //["Sharon", "Sandy", "Van", "Roster", "Jobs"]
        console.log(person1.friends); //["Sharon", "Sandy", "Van", "Roster", "Jobs"]
        console.log(person2.friends); //["Sharon", "Sandy", "Van", "Roster", "Jobs"]

        克羅克福德主張的這種原型式繼承,要求你必須有一個(gè)對(duì)象可以作為另一個(gè)對(duì)象的基礎(chǔ)。

        如果有這么一個(gè)對(duì)象的話,可以把它傳給object()函數(shù),然后再根據(jù)具體需求對(duì)得到的對(duì)象加以修改即可。

        ECMAscript5通過新增Object.create()方法規(guī)范了原型式繼承。
        這個(gè)方法接收兩個(gè)參數(shù): 一個(gè)用作新對(duì)象原型的對(duì)象和(可選的)一個(gè)為新對(duì)象定義額外屬性的對(duì)象。

        在傳入一個(gè)參數(shù)的情況下,Object.create()與object()方法的行為相同。

        var person = {
         name: "Shaw",
         friends: ["Sharon", "Sandy", "Van"]
        }
        
        var person1 = Object.create(person);
        person1.name = "Roc";
        person1.friends.push("Roster");
        
        var person2 = Object.create(person);
        person2.name = "Linda";
        person2.friends.push("Messi");
        
        console.log(person.friends); //["Sharon", "Sandy", "Van", "Roster", "Messi"]
        console.log(person1.friends); //["Sharon", "Sandy", "Van", "Roster", "Messi"]
        console.log(person2.friends); //["Sharon", "Sandy", "Van", "Roster", "Messi"]

        Object.create()方法的第二個(gè)參數(shù)與Object.defienProperties()方法的第二個(gè)參數(shù)格式相同:

        每個(gè)屬性都是通過自己的描述符定義的。

        以這種方式指定的任何屬性都會(huì)覆蓋原型對(duì)象上的同名屬性。

        var person = {
         name: "Shaw",
         friends: ["Sharon", "Sandy", "Selina"]
        }
        
        var person1 = Object.create(person, {
         name: {
         value: "Roc"
         }
        })
        
        console.log(person1.name); //"Roc"

        支持Object.create()方法的瀏覽器有IE9+, Firefox 4+, Opera 12+ 和 Chrome。

        適用場(chǎng)景:

        在沒有必要興師動(dòng)眾地創(chuàng)建構(gòu)造函數(shù),而只想讓一個(gè)對(duì)象與另外一個(gè)對(duì)象保持類似的情況下,原型式繼承是完全可以勝任的。

        千萬要記住,包含引用類型值的屬性始終都會(huì)共享相應(yīng)的值,就像使用原型模式一樣。

        寄生式繼承

        寄生式(parasitic)繼承是與原型式繼承緊密相關(guān)的一種思路,并且也是由大神克勞克福推而廣之的。

        寄生式繼承的思路與寄生構(gòu)造函數(shù)和工廠模式類似。

        創(chuàng)建一個(gè)僅用于封裝繼承過程的函數(shù),該函數(shù)在內(nèi)部以某種方式來增強(qiáng)對(duì)象,最后再像真地是它做了所有工作一樣返回對(duì)象。

        function object(o){
         function F(){};
         F.prototype = o;
         return new F();
        }
        
        function createAnother(original) {
         var clone = object(original); //通過調(diào)用函數(shù)創(chuàng)建一個(gè)新對(duì)象
         clone.sayHi = function(){ //以某種方式來增強(qiáng)這個(gè)對(duì)象
         console.log("hi");
         }
         return clone; //返回這個(gè)對(duì)象
        }

        在這個(gè)例子中, createAnother()函數(shù)接收了換一個(gè)參數(shù),也就是將要作為新對(duì)象基礎(chǔ)的對(duì)象。
        然后,把這個(gè)對(duì)象參數(shù)(original)傳遞給object()函數(shù), 將返回的結(jié)果賦值給clone。

        再為clone對(duì)象添加一個(gè)新方法sayHi(),最后返回clone對(duì)象。

        可以像下面這樣來使用createAnother()函數(shù):

        function object(o){
         function F(){};
         F.prototype = o;
         return new F();
        }
        
        function createAnother(original) {
         var clone = object(original); //通過調(diào)用函數(shù)創(chuàng)建一個(gè)新對(duì)象
         clone.sayHi = function(){ //以某種方式來增強(qiáng)這個(gè)對(duì)象
         console.log("hi");
         }
         return clone; //返回這個(gè)對(duì)象
        }
        
        var person = {
         name: "Shaw",
         friends: ["Sandy", "Sharon", "Van"]
        }
        
        var anotherPerson = createAnother(person);
        
        anotherPerson.sayHi(); //"hi"

        這個(gè)例子中的代碼基于person返回一個(gè)新對(duì)象——anotherPerson。新對(duì)象不僅具有person的所有屬性和方法,而且還有還有自己的sayHi()方法。

        在主要考慮對(duì)象而不是自定義類型和構(gòu)造函數(shù)的情況下,寄生式繼承也是一種有用的模式。

        前面示范繼承模式時(shí)使用的object()函數(shù)不是必需的,任何能夠返回新對(duì)象的函數(shù)都適用于此模式。

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JS中原型式和寄生式繼承的詳解(代碼示例)

        JS中原型式和寄生式繼承的詳解(代碼示例):本篇文章給大家?guī)淼膬?nèi)容是關(guān)于JS中原型式和寄生式繼承的詳解(代碼示例),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的
        推薦度:
        標(biāo)簽: js 詳解 寄生
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 一级毛片不卡片免费观看| 国产精品无码免费播放| 国产免费A∨在线播放| 特级精品毛片免费观看| 亚洲精品乱码久久久久久自慰| 亚洲另类图片另类电影| 免费看黄福利app导航看一下黄色录像| 亚洲欧洲免费视频| 亚洲欧洲免费视频| 一区二区免费电影| 精品免费国产一区二区| 亚洲AV无码一区二区二三区软件 | 亚洲人成网站18禁止久久影院| 毛片无码免费无码播放| 亚洲国产高清在线一区二区三区| 亚洲精品福利网泷泽萝拉| 国产精品九九久久免费视频| 欧亚精品一区三区免费| 亚洲成AV人影片在线观看| 美女视频黄的全免费视频网站| 亚洲精品你懂的在线观看 | 亚洲一级片免费看| 亚洲国产婷婷六月丁香| 91九色视频无限观看免费| 国产美女亚洲精品久久久综合| 亚洲日本天堂在线| 免费国产黄线在线观看| 成人精品国产亚洲欧洲| 国产精品美女午夜爽爽爽免费| 亚洲avav天堂av在线网毛片| 91免费精品国自产拍在线不卡| 中文字幕亚洲色图| 99视频在线免费看| 亚洲色大成网站www永久男同| 久久天天躁狠狠躁夜夜免费观看| 猫咪免费人成在线网站| 免费二级毛片免费完整视频| 亚洲乱码无人区卡1卡2卡3| 亚洲视频在线一区二区| 一个人看的www视频免费在线观看 一个人看的免费观看日本视频www | 午夜视频在线免费观看|