<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關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        JavaScript類的繼承操作實例總結

        來源:懂視網 責編:小采 時間:2020-11-27 22:02:28
        文檔

        JavaScript類的繼承操作實例總結

        JavaScript類的繼承操作實例總結:本文實例總結了JavaScript類的繼承操作。分享給大家供大家參考,具體如下: 一、類式繼承 首先要做的是創建構造函數。按慣例,其名稱就是類名,首字母應該大寫。在構造函數中,創建實例屬性要用關鍵字this 。類的方法則被添加到prototype對象中。要創建該
        推薦度:
        導讀JavaScript類的繼承操作實例總結:本文實例總結了JavaScript類的繼承操作。分享給大家供大家參考,具體如下: 一、類式繼承 首先要做的是創建構造函數。按慣例,其名稱就是類名,首字母應該大寫。在構造函數中,創建實例屬性要用關鍵字this 。類的方法則被添加到prototype對象中。要創建該

        本文實例總結了JavaScript類的繼承操作。分享給大家供大家參考,具體如下:

        一、類式繼承

        首先要做的是創建構造函數。按慣例,其名稱就是類名,首字母應該大寫。在構造函數中,創建實例屬性要用關鍵字this 。類的方法則被添加到prototype對象中。要創建該類的實例,只需結合關鍵字new調用這構造函數即可。

        /* Class Person. */
        function Person(name) {
         this.name = name;
        }
        Person.prototype.getName = function() {
         return this.name;
        }
        var reader = new Person('John Smith');
        reader.getName();
        
        

        二、原型鏈

        JavaScript的每個對象都有一個名為prototype的屬性,這個屬性要么指向另一個對象,要么是null.在訪問對象的某個成員時,如果這個成員未見于當前對象,那么就會到prototype所指的對象中去查找。如果還是沒有找到,那么就會沿著原型鏈逐一訪問每個原型對象,直到找到這個成員。這意味著讓一個類繼承另一個類,只需將子類的prototype設置為超類的一個實例即可。

        為了讓Author繼承Person,必須手工將Author的prototype設置為Person的一個實例。最后一步是將prototypeconstruct屬性重設為Author(因為prototype屬性設置為Person的實例)時,其construct屬性被抹除了。

        function Author(name, books) {
         Person.call(this, name); // Call the superclass' constructor in the scope of this.
         this.books = books; // Add an attribute to Author.
        }
        Author.prototype = new Person(); // Set up the prototype chain.
        Author.prototype.constructor = Author; // Set the constructor attribute to Author.
        Author.prototype.getBooks = function() { // Add a method to Author.
         return this.books;
        };
        var author = [];
        author[0] = new Author('Dustin Diaz', ['JavaScript Design Patterns']);
        author[1] = new Author('Ross Harmes', ['JavaScript Design Patterns']);
        console.log(author[1].getName());
        console.log(author[1].getBooks());
        
        

        三、extend函數

        為了簡化類的聲明,可以把派生子類的整個過程包裝在一個名為extend的函數中。它的作用與其他語言的extend關鍵字類似,即基于一個給定的類的結構創建一個新的類:

        function extend(subClass, superClass) {
         var F = function() {};
         F.prototype = superClass.prototype;
         subClass.prototype = new F();
         subClass.prototype.constructor = subClass;
        }
        
        

        其實所做的事與之前的是一樣的。它先設置了prototype,然后再將其constructor重設為恰當的值。并且中間利用了一個空函數,這樣就可以避免創建超類的實例。使用extend繼承的寫法:

        function Person(name) {
         this.name = name;
        }
        Person.prototype.getName = function() {
         return this.name;
        }
        /* Class Author. */
        function Author(name, books) {
         Person.call(this, name);
         this.books = books;
        }
        extend(Author, Person);
        Author.prototype.getBooks = function() {
         return this.books;
        };
        
        

        但上面的存在一個問題就是超類Person的名稱被固化在Author類的聲明當中。更普世性的做法應該像下面這樣:

        /* Extend function, improved. */
        function extend(subClass, superClass) {
         var F = function() {};
         F.prototype = superClass.prototype;
         subClass.prototype = new F();
         subClass.prototype.constructor = subClass;
         subClass.superclass = superClass.prototype;
         if(superClass.prototype.constructor == Object.prototype.constructor) {
         superClass.prototype.constructor = superClass;
         }
        }
        /* Class Author. */
        function Author(name, books) {
         Author.superclass.constructor.call(this, name);
         this.books = books;
        }
        extend(Author, Person);
        Author.prototype.getBooks = function() {
         return this.books;
        };
        Author.prototype.getName = function() {
         var name = Author.superclass.getName.call(this);
         return name + ', Author of ' + this.getBooks().join(', ');
        };
        
        

        這個extend改進之后,多了一個superclass的屬性,這個屬性可以弱化Author和Person之間的耦合。extend后面三行用來確保超類的construtor已經被正確設置了。有了superclass的屬性,就可以直接調用超類中的方法。這在既要重新定義超類的某個方法而又想訪問其在超類中的實現時可以派上用場。例如,為了用一個新的getName的方法重新定義Person類中的同名方法,你可以先用Author.superclass.getName獲得作者的名字,然后再次基礎上添加新的信息。

        四、原型繼承

        原型式繼承與類式繼承截然不同,我們在學習他的時候,最好忘記自己關于類和實例的一切知識,只從對象的角度來思考。使用原型式繼承時,并不需要用類來定義對象的結構,只需直接創建一個對像就可以。這個對象隨后可以被新的對象使用,該對象被稱為原型對象。

        下面使用原型對象來重新設計上面Person和Author:

        var Person = {
         name: 'default name',
         getName: function() {
         return this.name;
         }
        };
        var reader = clone(Person);
        alert(reader.getName()); // This will output 'default name'.
        reader.name = 'John Smith';
        alert(reader.getName()); // This will now output 'John Smith'.
        
        

        clone函數可以用來創建新的類Person對象,創建一個空對象,并且該對象的原型對象被設置為person。當新對象中找不到某個方法時就會在原型對象中查找。

        你不必去為了創建Author而定義一個Person子類,只要執行一次克隆就可以:

        var Author = clone(Person);
        Author.books = []; // Default value.
        Author.getBooks = function() {
         return this.books;
        }
        
        

        然后你可以重定義該克隆中的方法和屬性。可以修改Person的默認值。也可以添加新的屬性和方法。這樣一來就創建了一個新的原型對象,你可以將其用于創建新的Author對象:

        var author = [];
        author[0] = clone(Author);
        author[0].name = 'Dustin Diaz';
        author[0].books = ['JavaScript Design Patterns'];
        author[1] = clone(Author);
        author[1].name = 'Ross Harmes';
        author[1].books = ['JavaScript Design Patterns'];
        author[1].getName();
        author[1].getBooks();
        
        

        clone函數的寫法:

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

        五、原型繼承和類式繼承之間的比較

        可以自己去總結、
        從內存,適用范圍,優缺點等方面去分析

        六、摻元類

        有一種重用代碼的方法不需要用到嚴格的繼承,如果想把一個函數運用到多個類當中,可以通過擴充的方法讓這些類共享函數。其實際大體做法就是:先創建一個包含各種通用的方法類,然后再擴充其他類,這種包含通用方法類稱為摻元類,他們通常不會被實例化和直接調用,其存在的目的是向其他類提供自己的方法。

        var Mixin = function() {};
        Mixin.prototype = {
         serialize: function() {
         var output = [];
         for(key in this) {
         output.push(key + ': ' + this[key]);
         }
         return output.join(', ');
         }
        };
        augment(Author, Mixin);
        var author = new Author('Ross Harmes', ['JavaScript Design Patterns']);
        var serializedString = author.serialize();
        function augment(receivingClass, givingClass) {
         for(methodName in givingClass.prototype) {
         if(!receivingClass.prototype[methodName]) {
         receivingClass.prototype[methodName] = givingClass.prototype[methodName];
         }
         }
        }
        
        

        但是有時候你并不需要所有的方法,因此我們還需要提供額外的參數來選擇我們所需要的方法。如果不提供,那就全部復制。

        function augment(receivingClass, givingClass) {
         if(arguments[2]) { // Only give certain methods.
         for(var i = 2, len = arguments.length; i < len; i++) {
         receivingClass.prototype[arguments[i]] = givingClass.prototype[arguments[i]];
         }
         }
         else { // Give all methods.
         for(methodName in givingClass.prototype) {
         if(!receivingClass.prototype[methodName]) {
         receivingClass.prototype[methodName] = givingClass.prototype[methodName];
         }
         }
         }
        }
        
        

        更多關于JavaScript相關內容還可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》

        希望本文所述對大家JavaScript程序設計有所幫助。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JavaScript類的繼承操作實例總結

        JavaScript類的繼承操作實例總結:本文實例總結了JavaScript類的繼承操作。分享給大家供大家參考,具體如下: 一、類式繼承 首先要做的是創建構造函數。按慣例,其名稱就是類名,首字母應該大寫。在構造函數中,創建實例屬性要用關鍵字this 。類的方法則被添加到prototype對象中。要創建該
        推薦度:
        標簽: js 類型的 實例
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 麻豆精品国产免费观看| 在线永久免费的视频草莓| 日本高清免费不卡在线| 亚洲人成日本在线观看| 日本人的色道免费网站| 亚洲欧洲日产韩国在线| 亚洲一级免费毛片| 亚洲天堂一区二区三区| 99热在线精品免费全部my| 亚洲综合偷自成人网第页色| 国产香蕉九九久久精品免费| 亚洲欧美日韩国产精品一区| 国产免费观看网站| 乱淫片免费影院观看| 亚洲AV无码第一区二区三区| 最好看的中文字幕2019免费| 天天爽亚洲中文字幕| 亚洲成AⅤ人影院在线观看| aa级毛片毛片免费观看久| 亚洲成av人片在线观看无码不卡| 无码午夜成人1000部免费视频| 亚洲成a人片在线网站| 黄页免费的网站勿入免费直接进入| 国产亚洲中文日本不卡二区| 免费国产真实迷j在线观看| 亚美影视免费在线观看| 久久亚洲美女精品国产精品| 啦啦啦高清视频在线观看免费 | 亚洲天堂免费在线| 亚洲国产欧洲综合997久久| 亚洲精品无码av天堂| 久久国产乱子伦精品免费一 | 最近中文字幕大全免费视频| 亚洲国产精品免费观看| 亚洲中久无码不卡永久在线观看| 成全视频免费观看在线看| 97se亚洲国产综合自在线| 亚洲一区视频在线播放| 免费人成在线观看69式小视频| 亚洲AV色欲色欲WWW| 亚洲av无码精品网站|