亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript類的繼承操作實例總結

2019-11-19 12:19:38
字體:
來源:轉載
供稿:網友

本文實例總結了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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品国内自产拍免费看| 性视频1819p久久| 久久久久国产精品免费| 欧美大片在线免费观看| 精品偷拍各种wc美女嘘嘘| 2018中文字幕一区二区三区| 亚洲男人天堂手机在线| 精品国产一区二区三区四区在线观看| 日韩欧中文字幕| 日韩欧美高清视频| 久久亚洲精品小早川怜子66| 国产性色av一区二区| 国产成人精品久久| 国产精品视频免费观看www| www.精品av.com| 亚洲缚视频在线观看| 美女性感视频久久久| 欧美怡春院一区二区三区| 欧美韩国理论所午夜片917电影| 欧美又大又硬又粗bbbbb| 国产精品你懂得| 久久久久久久久中文字幕| 午夜精品久久久久久久99热| 久久深夜福利免费观看| 热久久美女精品天天吊色| 中文字幕在线观看日韩| 性欧美激情精品| 91亚洲精华国产精华| 国产精品jizz在线观看麻豆| 国产精品久久在线观看| 在线观看日韩www视频免费| 久久影视电视剧凤归四时歌| 国产精品入口免费视| 欧美日韩亚洲一区二区三区| 欧美视频在线免费看| 久久亚洲影音av资源网| 91产国在线观看动作片喷水| 91精品国产高清自在线| 91沈先生在线观看| 成人黄色av网站| 超碰91人人草人人干| 久久久亚洲福利精品午夜| 亚洲伊人久久大香线蕉av| 国产69精品久久久| 国产日韩欧美一二三区| 日韩在线视频国产| 亚洲欧美国产制服动漫| 欧美激情第6页| 黑人巨大精品欧美一区二区免费| 亚洲伊人一本大道中文字幕| 欧美午夜激情视频| 亚洲国产另类久久精品| 57pao国产成人免费| 亚洲成色777777女色窝| 国模精品视频一区二区| 日韩视频中文字幕| 免费不卡欧美自拍视频| 91精品国产色综合久久不卡98| 欧美日韩国产丝袜美女| 91av视频在线播放| 国产精品久久二区| 97久久精品视频| 久久久av一区| 丰满岳妇乱一区二区三区| 国产成人精品av在线| 久久99久久99精品免观看粉嫩| 亚洲视频在线观看免费| 久久99热精品| 久久久精品免费| 亚洲自拍偷拍一区| 亚洲精品自产拍| 亚洲一区二区三区777| 91在线观看免费网站| 精品偷拍一区二区三区在线看| 国产91九色视频| 亚洲三级黄色在线观看| 亚洲影院高清在线| 国产一区二区三区高清在线观看| 亚洲成人999| 国产精品www色诱视频| 成人看片人aa| 国产精品久久久久久久久久99| 亚洲天堂久久av| 国产精品青青在线观看爽香蕉| 欧美日韩亚洲国产一区| 中文字幕精品影院| 黄色成人av网| 国产一区二区日韩| 日本伊人精品一区二区三区介绍| 91成人在线观看国产| 色偷偷偷综合中文字幕;dd| 国产日韩欧美日韩| 亚洲最大成人在线| 国产精品96久久久久久| 最新日韩中文字幕| 在线观看日韩专区| 国产精品亚洲视频在线观看| 亚洲欧美激情视频| 久久久女女女女999久久| 孩xxxx性bbbb欧美| 亚洲人a成www在线影院| 欧美性理论片在线观看片免费| 日韩大陆欧美高清视频区| 亚洲a级在线播放观看| 国产欧美日韩精品在线观看| 亚洲精品有码在线| 精品国产乱码久久久久久婷婷| 18性欧美xxxⅹ性满足| 亚洲天堂av图片| 国产精品一区二区女厕厕| 国产噜噜噜噜噜久久久久久久久| 中文字幕亚洲无线码a| 成年无码av片在线| 久久精品国产99国产精品澳门| 国产做受高潮69| 国产精品中文字幕在线观看| 精品久久香蕉国产线看观看亚洲| 91av在线精品| 国产美女久久久| 久久综合色影院| 久久久久久久久久久久久久久久久久av| 揄拍成人国产精品视频| 在线一区二区日韩| 日韩欧美成人精品| 97久久精品国产| 最好看的2019年中文视频| 精品女同一区二区三区在线播放| 国产精品成人在线| 国产一区二区三区在线观看视频| 日韩欧美aaa| 精品国产31久久久久久| 久久影视电视剧凤归四时歌| 亚洲第一网中文字幕| 精品视频久久久久久| 亚洲va码欧洲m码| 欧美激情亚洲一区| 欧美在线视频网| 色老头一区二区三区| 成人在线免费观看视视频| 国产91精品高潮白浆喷水| 亚洲精品资源在线| 国产欧美日韩丝袜精品一区| 国产精品黄色av| 国内外成人免费激情在线视频网站| 日产日韩在线亚洲欧美| 亚洲欧美日韩图片| 一本色道久久综合亚洲精品小说| 亚洲国产美女精品久久久久∴| 日日摸夜夜添一区| 久久精品国产亚洲一区二区| 在线观看国产精品日韩av| 国产精品成熟老女人| 成人免费观看a| 欧美性生交大片免费| 97婷婷大伊香蕉精品视频| 不卡毛片在线看| 日韩亚洲欧美中文高清在线| 亚洲va久久久噜噜噜| 久久久久久久av| 国产精品流白浆视频| 国产精品视频xxxx| 欧美激情亚洲另类| 亚洲影院高清在线| 疯狂蹂躏欧美一区二区精品|