日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

js學習筆記之class類、super和extends關鍵詞

瀏覽:216日期:2024-03-21 16:52:11
目錄前言1.es6之前創建對象2.es6之后class的聲明3.類的繼承4.繼承類的靜態成員寫在最后前言

JavaScript 語言在ES6中引入了 class 這一個關鍵字,在學習面試的中,經常會遇到面試官問到談一下你對 ES6 中class的認識,同時我們的代碼中如何去使用這個關鍵字,使用這個關鍵字需要注意什么,這篇來總結一下相關知識點。

正文

1.es6之前創建對象

先來看下es6之前我們要想創建一個對象,只能通過構造函數的方式來創建,將靜態方法添加在原型上面使得每一個實例能夠調用該方法。

function Person(name, age) { this.name = name this.age = age Person.prototype.sayHello = function () {return 'hello,' + this.name + ',早上好' }}let person = new Person('serendipity', 18)console.log(person.sayHello())//hello,serendipity,早上好console.log(person instanceof Person);//trueconsole.log(person instanceof Object);//true2.es6之后class的聲明

類是用于創建對象的模板,他們用代碼封裝數據以處理該數據。js中的 class 類建立在原型之上,但也具有某些語法和語義與ES5類相似語義共享。

實際上,類是一種特殊的函數,就像定義函數聲明和函數表達式一樣,類的語法也有兩個部分組成:類聲明和類表達式。

class Person { constructor(name, age) {//自有屬性,該屬性出現在實例上,只能在類的構造器或者方法內部進行創建this.name = namethis.age = age } sayHello() {//等價于Perosn.prototype.sayHelloreturn `hello,${this.name},早上好` }}let person = new Person('serendipity', 18)console.log(person.sayHello());//hello,serendipity,早上好console.log(person instanceof Person);//trueconsole.log(person instanceof Object);//trueconsole.log(typeof Person);//functionconsole.log(typeof Person.prototype.sayHello);//function

類聲明允許在class中使用 constructor 方法定義一個構造器,而不需要定義專門的構造方法來當構造器使用。

class 類的語法與普通es5之前的函數語法相似,但是還存在一些特性需要注意:

(1)類的聲明不會被提升,類的聲明行為和 let 相似,因此執行時類會存在暫時性死區;

(2)類中所有代碼自動運行在嚴格模式下,且改嚴格模式無法退出

(3) 類中所有方法都是不可枚舉的,普通自定義方法只有通過 object.defineProperty() 才能將方法定義為不可枚舉

(4)類中的所有方法內部都沒有 [[construct]] ,因此使用new 來調用他們會拋出錯誤

(5)調用類構造器時不使用 new 會拋出錯誤

(6)試圖在類的方法內部重寫類名會拋出錯誤

將上面的代碼轉換為ES5之前的寫法如下:

let PersonClass = (function () { 'use strict' const PersonClass = function (name, age) {// 判斷是否被new調用構造函數if (typeof new.target === 'undefined') { throw new Error('Constructor must be call with new.')}this.name = namethis.age = age } Object.defineProperty(PersonClass.prototype, 'sayHello', {value: function () { if (typeof new.target !== 'undefined') {//保正調用時沒有使用newthrow new Error('Method cannot be called with new.') } return 'hello,' + this.name + ',早上好!'},enumerable: false,configurable: true,writable: true }) return PersonClass})()var personClass = new PersonClass('serendipity', 18)console.log(personClass.name);//serendipityconsole.log(personClass.sayHello());///hello,serendipity,早上好!

兩個PersonClass 聲明,一個在外部作用域的 let 聲明,另一個在立即執行函數內部的 const 聲明,這就是為何類的方法不能對類名進行重寫,而類的外部的代碼則被允許。同時,只在類的內部類名才被視為使用了const聲明,這意味著你可以在外部(相當于let)重寫類名,但是不能在類的方法內部這么寫。

3.類的繼承

ES6之前的繼承方式主要通過構造函數和原型鏈組合的方式來實現繼承,具體代碼如下:

function Rectangle(length, width) { this.length = length this.width = width Rectangle.prototype.getArea = function () {return this.length * this.width }}function Square(length) { Rectangle.call(this, length, length)}Square.prototype = Object.create(Rectangle.prototype, { constructor: {value: Square,enumerble: true,writeable: true,configurable: true }})var square = new Square(3)console.log(square.getArea());//9console.log(square instanceof Square);//trueconsole.log(square instanceof Rectangle);//true

上面的代碼通過構造函數和原型上面添加靜態方法實現了 Rectangle 父類,然后子類 Square 通過 Rectangle.call(this,length,length) 調用了父類的構造函數,Object.create 會在內部創建一個空對象來連接兩個原型對象,再手動將 constructor 指向自身。這種方法實現繼承代碼繁雜且不利用理解,于是ES6 class 類的創建讓繼承變得更加簡單,使用extends 關鍵字來指定當前類所需要繼承的父類,生成的類的原型會自動調整,還可以使用 super() 方法來訪問基類的構造器。具體代碼如下:

class Rectangle { constructor(length, width) {this.length = lengththis.width = width } getArea() {return this.length * this.width }}class Square extends Rectangle { constructor(length) {super(length, length) } getArea() {return this.length + this.length }}var square = new Square(3)console.log(square.getArea());//6console.log(square instanceof Square);//trueconsole.log(square instanceof Rectangle);//true

上面的代碼中 Square 類重寫了基類的 getArea() 方法,當派生的子類中函數名和基類中函數同名的時候,派生類的方法會屏蔽基類的方法,同時也可以再子類中getArea () { return super.getArea() }中調用基類的方法進行擴展。

4.繼承類的靜態成員

靜態成員:直接在構造器上添加的額外的方法。例如ES5中在原型上添加的方法就屬于靜態成員,ES6 class類引入簡化了靜態成員的創建,只需要在方法與訪問器屬性的名稱前添加 static關鍵字即可。例如下面的代碼用于區分靜態方法和實例方法。

function PersonType(name) {this.name = name; } // 靜態方法 PersonType.create = function(name) {return new PersonType(name); }; // 實例方法 PersonType.prototype.sayName = function() {console.log(this.name); };var person = PersonType.create('Nicholas');

在ES6中要想使用靜態成員如下:

class Rectangle { constructor(length ,width) {this.length = lengththis.width = width } getArea() {return this.length * this.width } static create(length,width) {return new Rectangle(length , width) }}class Square extends Rectangle{ constructor (length){super(length,length) }}var square =Square.create(3,4)console.log(square.getArea());//12console.log(square instanceof Square);//falseconsole.log(square instanceof Rectangle);//true

上面的代碼中,一個新的靜態方法 create() 被添加到 Rectangle 類中,通過繼承,以Square.create() 的形式存在,并且其行為方式與Rectangle.create() 一樣。需要注意靜態成員不懂通過實例來訪問,始終需要直接調用類自身來訪問他們。

寫在最后

以上就是本文的全部內容,希望給讀者帶來些許的幫助和進步,方便的話點個關注,小白的成長踩坑之路會持續更新一些工作中常見的問題和技術點。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
天堂va欧美ⅴa亚洲va一国产| 久久中文字幕一区二区| 日韩精品久久理论片| 亚洲视频二区| 99视频精品视频高清免费| 伊人网在线播放| 久久一区二区三区喷水| 91九色精品| 热久久国产精品| 日韩在线观看中文字幕| 欧美一区自拍| 成人在线视频中文字幕| 福利在线免费视频| 夜久久久久久| 奇米狠狠一区二区三区| 国产精品www994| 正在播放日韩精品| 日韩午夜精品| 91国内精品| 国产精品videossex| 久久精品国产亚洲夜色av网站| 亚洲高清二区| 69精品国产久热在线观看| 日本不良网站在线观看| 黄色国产精品| 精品一区电影| 亚洲精品黄色| 亚洲一级少妇| 青青伊人久久| 在线亚洲激情| 成人欧美一区二区三区的电影| 免费美女久久99| 97se综合| 国产精品久久久免费| 久久天堂成人| 国产毛片精品| 亚洲精品美女91| 中文在线а√在线8| 日本aⅴ精品一区二区三区| 日韩一区三区| 国产精品欧美日韩一区| 婷婷中文字幕一区| 红杏一区二区三区| 亚洲18在线| 亚洲精品小说| 亲子伦视频一区二区三区| 国产欧美一区二区精品久久久 | 国产精品s色| 亚洲区国产区| 免费在线观看成人| 亚洲成a人片| 老司机精品在线| 国产精品亚洲产品| 亚洲精品进入| 国产精品美女久久久浪潮软件| 亚洲性图久久| 亚洲激情五月| 日韩网站在线| 黄色亚洲免费| 午夜在线一区二区| 亚洲丝袜啪啪| 亚洲一区欧美激情| 日韩精品一级二级| 在线一区二区三区视频| 久久成人亚洲| 蜜桃视频在线观看一区| 日韩精品导航| 国产精品手机在线播放| 久久一区国产| 桃色av一区二区| 欧美99久久| 视频一区中文字幕| 免费在线欧美黄色| 国产精品久久久久久久久久齐齐| 国产精品主播| 日韩av在线播放网址| 国产精品亚洲片在线播放| 国产一区二区三区日韩精品 | 久久精品天堂| 久久婷婷av| 综合色就爱涩涩涩综合婷婷| 日韩三级精品| 美腿丝袜亚洲三区| 欧美日韩中文一区二区| 女人天堂亚洲aⅴ在线观看| 国产精品videossex| 99国产精品免费视频观看| 激情综合在线| 中文一区一区三区免费在线观 | 蜜桃一区二区三区| 一级成人国产| 国产成人精品一区二区三区视频 | 久久精品亚洲人成影院| 久久久久蜜桃| 日本综合精品一区| 蜜桃av在线播放| 日韩中文字幕视频网| 激情黄产视频在线免费观看| 国产亚洲一区二区手机在线观看| 99久久久久国产精品| 日韩视频1区| 99国产精品99久久久久久粉嫩| 国产欧美69| 亚洲激情av| 91视频精品| 国产午夜久久av| 伊人久久成人| 裤袜国产欧美精品一区| 天堂va在线高清一区| 国内精品福利| 国产超碰精品| 亚洲精华国产欧美| 久久精品国产久精国产爱| 午夜欧美理论片| 免费精品一区| 91精品尤物| 亚洲精品动态| 好吊日精品视频| 国产高清一区| 日韩欧美一区二区三区免费看| 麻豆国产欧美一区二区三区| 日本中文字幕一区二区| 视频精品一区二区| 亚洲资源av| 亚洲精品国产精品粉嫩| 免费人成黄页网站在线一区二区| 国产亚洲精品自拍| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产一区丝袜| 麻豆国产精品| 成人亚洲精品| 免费一级欧美片在线观看网站| 日韩精品亚洲专区在线观看| 日韩综合小视频| 911精品国产| 国产精品一区二区av交换| 国产精品一级| 精品高清久久| 成人免费网站www网站高清| 精品日韩一区| 国产精品久久久久久久久妇女| 国产一区二区三区不卡av| 欧美一区91| 免费日韩一区二区三区| 色婷婷亚洲mv天堂mv在影片| 荡女精品导航| 欧美aa在线观看| 亚洲欧洲日本mm| 日韩视频1区| 黑人精品一区| 综合欧美精品| 国产在线不卡一区二区三区 | 国产精品原创| 在线日韩成人| 成人午夜毛片| 国产一区观看| 国产日韩亚洲欧美精品| 神马久久午夜| 亚洲久久在线| 午夜精品成人av| 日韩激情啪啪| 99久久精品费精品国产| 欧美日本精品| 尤物精品在线| 精品视频91| 天堂成人国产精品一区| 国产精品久久久久久av公交车| 亲子伦视频一区二区三区| 日韩av网站在线免费观看| 日韩不卡在线| 亚洲精品伊人| 国产专区一区| 国产精品大片免费观看| 亚洲一二av| 红桃视频国产一区| 日本免费久久| 免费亚洲婷婷| 欧美日本二区| 视频一区二区三区在线| 99精品在线观看| 国产一区二区视频在线看| 国产图片一区| 日韩一区二区三区精品| 午夜欧美精品久久久久久久| 国产精品精品| 欧美亚洲色图校园春色| 久久午夜精品| 久热精品在线| 男女性色大片免费观看一区二区| 私拍精品福利视频在线一区| 欧美激情 亚洲a∨综合| 国产乱人伦精品一区| 日韩精品高清不卡| 日韩精彩视频在线观看| 一二三区精品| 日韩精品电影一区亚洲| 综合国产精品| 国产精品视频一区视频二区| 欧美激情麻豆| 9999国产精品|