电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

js學(xué)習(xí)筆記之class類、super和extends關(guān)鍵詞

瀏覽:102日期:2024-03-21 16:52:11
目錄前言1.es6之前創(chuàng)建對(duì)象2.es6之后class的聲明3.類的繼承4.繼承類的靜態(tài)成員寫在最后前言

JavaScript 語言在ES6中引入了 class 這一個(gè)關(guān)鍵字,在學(xué)習(xí)面試的中,經(jīng)常會(huì)遇到面試官問到談一下你對(duì) ES6 中class的認(rèn)識(shí),同時(shí)我們的代碼中如何去使用這個(gè)關(guān)鍵字,使用這個(gè)關(guān)鍵字需要注意什么,這篇來總結(jié)一下相關(guān)知識(shí)點(diǎn)。

正文

1.es6之前創(chuàng)建對(duì)象

先來看下es6之前我們要想創(chuàng)建一個(gè)對(duì)象,只能通過構(gòu)造函數(shù)的方式來創(chuàng)建,將靜態(tài)方法添加在原型上面使得每一個(gè)實(shí)例能夠調(diào)用該方法。

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的聲明

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

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

class Person { constructor(name, age) {//自有屬性,該屬性出現(xiàn)在實(shí)例上,只能在類的構(gòu)造器或者方法內(nèi)部進(jìn)行創(chuàng)建this.name = namethis.age = age } sayHello() {//等價(jià)于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 方法定義一個(gè)構(gòu)造器,而不需要定義專門的構(gòu)造方法來當(dāng)構(gòu)造器使用。

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

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

(2)類中所有代碼自動(dòng)運(yùn)行在嚴(yán)格模式下,且改嚴(yán)格模式無法退出

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

(4)類中的所有方法內(nèi)部都沒有 [[construct]] ,因此使用new 來調(diào)用他們會(huì)拋出錯(cuò)誤

(5)調(diào)用類構(gòu)造器時(shí)不使用 new 會(huì)拋出錯(cuò)誤

(6)試圖在類的方法內(nèi)部重寫類名會(huì)拋出錯(cuò)誤

將上面的代碼轉(zhuǎn)換為ES5之前的寫法如下:

let PersonClass = (function () { 'use strict' const PersonClass = function (name, age) {// 判斷是否被new調(diào)用構(gòu)造函數(shù)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') {//保正調(diào)用時(shí)沒有使用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,早上好!

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

3.類的繼承

ES6之前的繼承方式主要通過構(gòu)造函數(shù)和原型鏈組合的方式來實(shí)現(xiàn)繼承,具體代碼如下:

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

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

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() 方法,當(dāng)派生的子類中函數(shù)名和基類中函數(shù)同名的時(shí)候,派生類的方法會(huì)屏蔽基類的方法,同時(shí)也可以再子類中g(shù)etArea () { return super.getArea() }中調(diào)用基類的方法進(jìn)行擴(kuò)展。

4.繼承類的靜態(tài)成員

靜態(tài)成員:直接在構(gòu)造器上添加的額外的方法。例如ES5中在原型上添加的方法就屬于靜態(tài)成員,ES6 class類引入簡化了靜態(tài)成員的創(chuàng)建,只需要在方法與訪問器屬性的名稱前添加 static關(guān)鍵字即可。例如下面的代碼用于區(qū)分靜態(tài)方法和實(shí)例方法。

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

在ES6中要想使用靜態(tài)成員如下:

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

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

寫在最后

以上就是本文的全部內(nèi)容,希望給讀者帶來些許的幫助和進(jìn)步,方便的話點(diǎn)個(gè)關(guān)注,小白的成長踩坑之路會(huì)持續(xù)更新一些工作中常見的問題和技術(shù)點(diǎn)。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | Dataforth隔离信号调理模块-信号放大模块-加速度振动传感器-北京康泰电子有限公司 | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 楼梯定制_楼梯设计施工厂家_楼梯扶手安装制作-北京凌步楼梯 | 液氮罐_液氮容器_自增压液氮罐_杜瓦瓶_班德液氮罐厂家 | 臻知网大型互动问答社区-你的问题将在这里得到解答!-无锡据风网络科技有限公司 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 广州番禺搬家公司_天河黄埔搬家公司_企业工厂搬迁_日式搬家_广州搬家公司_厚道搬迁搬家公司 | 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | 股票入门基础知识_股票知识_股票投资大师_格雷厄姆网 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | LED投光灯-工矿灯-led路灯头-工业灯具 - 山东普瑞斯照明科技有限公司 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 济南轻型钢结构/济南铁艺护栏/济南铁艺大门-济南燕翔铁艺制品有限公司 | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | 卫生型双针压力表-高温防腐差压表-安徽康泰电气有限公司 | 二手电脑回收_二手打印机回收_二手复印机回_硒鼓墨盒回收-广州益美二手电脑回收公司 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 模温机-油温机-电加热导热油炉-工业冷水机「欧诺智能」 | 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | 创绿家招商加盟网-除甲醛加盟-甲醛治理加盟-室内除甲醛加盟-创绿家招商官网 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 雷达液位计_超声波风速风向仪_雨量传感器_辐射传感器-山东风途物联网 | 云南成考网_云南成人高考报名网 粤丰硕水性环氧地坪漆-防静电自流平厂家-环保地坪涂料代理 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 电线电缆厂家|沈阳电缆厂|电线厂|沈阳英联塑力线缆有限公司 | 成都珞石机械 - 模温机、油温机、油加热器生产厂家 | 气动球阀_衬氟蝶阀_调节阀_电动截止阀_上海沃托阀门有限公司 | TMT观察网_独特视角观察TMT行业 派财经_聚焦数字经济内容服务平台 | 无锡门窗-系统门窗-阳光房-封阳台-断桥铝门窗厂[窗致美] | 实验室隔膜泵-无油防腐蚀隔膜泵-耐腐蚀隔膜真空泵-杭州景程仪器 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 立式_复合式_壁挂式智能化电伴热洗眼器-上海达傲洗眼器生产厂家 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 物流之家新闻网-最新物流新闻|物流资讯|物流政策|物流网-匡匡奈斯物流科技 | 钢丝绳探伤仪-钢丝绳检测仪-钢丝绳探伤设备-洛阳泰斯特探伤技术有限公司 | 无缝方管|无缝矩形管|无缝方矩管|无锡方管厂家 | 铁素体测量仪/检测仪/铁素体含量测试仪-苏州圣光仪器有限公司 |