成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:182日期: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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品资源| 国产成人精品三级| 成人久久18免费网站麻豆| 国产精品夜夜夜| 国产精品视频你懂的| 欧美精品一区二区三区在线看午夜| www国产亚洲精品久久麻豆| 懂色av一区二区三区免费看| 欧美丝袜丝交足nylons| 成人av在线网| 久久久亚洲综合| 午夜精品网站| 国产精品久久久久久久久免费樱桃| 欧美在线网址| 国产精品国产自产拍高清av王其 | 亚洲视频一区二区在线观看| 欧美精品亚洲精品| 亚洲国产精品精华液ab| 午夜欧美精品久久久久久久| 欧美国产日韩亚洲一区| 亚洲视频观看| 洋洋av久久久久久久一区| 亚洲深夜激情| 欧美日韩大陆一区二区| 国内精品久久久久影院色| 欧美一级日韩免费不卡| 99re这里只有精品视频首页| 欧美国产视频在线| av不卡免费看| 免费人成精品欧美精品| 亚洲色图19p| 亚洲免费在线精品一区| 日韩福利电影在线观看| 欧美日本一道本在线视频| 成人激情av网| 成人一区在线观看| 中文字幕一区二区在线播放| 国产视频一区免费看| 蜜臀av性久久久久av蜜臀妖精| 欧美日韩黄色影视| 99精品热视频| 亚洲精品免费电影| 色哟哟一区二区| 国产精品一区一区三区| 国产欧美日韩综合精品一区二区| 亚洲大黄网站| 日韩vs国产vs欧美| 欧美日韩国产一级片| 成人高清伦理免费影院在线观看| 日本一区二区三区dvd视频在线| 国内激情久久| 午夜一区二区三区视频| 欧美一区二区美女| 91在线一区二区| 亚洲三级在线看| 在线观看欧美日本| 成人教育av在线| 欧美区在线观看| 91在线你懂得| 一区二区在线看| 欧美日韩三级一区| 成人av免费在线观看| 精品国产1区二区| 黄色成人av网站| 日韩成人免费在线| 91精品国产全国免费观看| 91免费观看视频在线| 国产精品福利影院| 国产精品日韩一区二区| 日韩va欧美va亚洲va久久| 日本韩国欧美国产| 成人黄色一级视频| 亚洲一区二区综合| 这里只有精品电影| 一区在线观看| 久久国产生活片100| 久久综合九色综合欧美亚洲| 伊人久久大香线蕉av超碰演员| 老司机免费视频一区二区三区| 精品久久久久久久久久久院品网 | 美国av一区二区| 日韩午夜中文字幕| 激情六月综合| 狠狠色狠狠色综合| 亚洲国产精品成人综合| 欧洲精品视频在线观看| 99久久精品99国产精品| 亚洲一区二区三区爽爽爽爽爽| 666欧美在线视频| 亚洲欧美在线网| 日韩综合在线视频| 久久综合久久综合亚洲| 国产精品一区二区在线观看| 国产专区欧美精品| 中文字幕亚洲欧美在线不卡| 色先锋久久av资源部| 91视频一区二区| 婷婷综合在线观看| 国产精品久久看| 欧美日韩一区二区在线观看视频| 欧美国产三区| 美女看a上一区| 欧美国产综合一区二区| 欧洲色大大久久| 午夜久久资源| 久久99久久久久| 综合久久久久综合| 欧美日本视频在线| 亚洲成人在线| 成人综合激情网| 26uuu精品一区二区在线观看| 国产精品一区二区在线观看| 91麻豆国产精品久久| 日韩成人av影视| 中文字幕av一区二区三区高| 91久久精品国产91性色tv| 欧美成人精品| 激情五月婷婷综合网| 亚洲视频免费在线| 日韩欧美在线1卡| 免费在线国产精品| 国语自产精品视频在线看抢先版结局 | 91精品国产综合久久久久久| 亚洲视频大全| 成人动漫一区二区| 日本不卡123| 综合精品久久久| 久久综合九色欧美综合狠狠 | 中文字幕av一区二区三区免费看 | 狠狠色综合网| 国产成人免费av在线| 亚洲综合激情另类小说区| 欧美草草影院在线视频| 欧美色综合网站| 亚洲一区二区四区| 欧美片第1页综合| 国产成人av电影在线观看| 视频在线观看国产精品| ...中文天堂在线一区| 久久网这里都是精品| 777色狠狠一区二区三区| 鲁大师成人一区二区三区| 亚洲高清资源| 亚洲欧美伊人| 成人三级伦理片| 精品一区二区三区久久久| 亚洲成人激情自拍| 亚洲国产精品久久艾草纯爱| 国产精品看片你懂得| 国产午夜精品久久久久久久| 日韩精品综合一本久道在线视频| 欧美亚洲一区二区三区四区| 麻豆成人在线播放| 久久精品一区二区三区四区| 99久久国产综合精品色伊| 秋霞国产午夜精品免费视频| 亚洲美女淫视频| 欧美国产精品劲爆| 精品福利一区二区三区| 欧美日韩精品免费观看视频| 一本大道久久a久久综合婷婷| 国产欧美欧美| 国产精品一区在线| 国产精品久99| 国产亚洲成aⅴ人片在线观看 | 日韩精品一区二区三区四区| 欧美日韩美少妇| 久久综合久久综合这里只有精品| 国产精品一区二区欧美| 亚洲国产日韩综合一区| 国内成人在线| 欧美黄在线观看| 欧美福利网址| 欧美日产一区二区三区在线观看| 不卡一区二区三区四区| 黑人巨大精品欧美一区| 国产一区欧美日韩| 国产乱码精品一区二区三区av| 卡一卡二国产精品 | 777欧美精品| 在线观看91精品国产麻豆| 欧美色综合网站| 欧美色窝79yyyycom| 欧美亚一区二区| 欧美日韩精品系列| 欧美精品乱码久久久久久| 欧美吞精做爰啪啪高潮| 欧美在线视频日韩| 欧美私模裸体表演在线观看| 欧美性色黄大片| 欧美日韩成人综合在线一区二区 | 国产精品福利一区二区| 成人欧美一区二区三区1314| 国产精品久久一卡二卡| 亚洲免费成人av| 亚洲午夜日本在线观看| 视频一区视频二区中文字幕| 免费观看在线综合色| 精品一区二区三区蜜桃| 国产精品一区二区三区乱码|