久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

es6 class是語(yǔ)法糖嗎

class是語(yǔ)法糖。原因:class是基于原型繼承的實(shí)現(xiàn),對(duì)語(yǔ)言的功能并沒(méi)有什么影響,只是方便了語(yǔ)法的書(shū)寫(xiě)及閱讀;class的本質(zhì)是function,能夠讓對(duì)象原型的寫(xiě)法更加清晰,更像面向?qū)ο缶幊痰恼Z(yǔ)法。

es6 class是語(yǔ)法糖嗎

前端(vue)入門到精通課程:進(jìn)入學(xué)習(xí)
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點(diǎn)擊使用

本教程操作環(huán)境:windows7系統(tǒng)、ECMAScript 6版、Dell G3電腦。

ES6 class類——語(yǔ)法糖

class (類)作為對(duì)象的模板被引入,可以通過(guò) class 關(guān)鍵字定義類。它的本質(zhì)是函數(shù)(function),可以看作一個(gè)語(yǔ)法糖,讓對(duì)象原型的寫(xiě)法更加清晰、更像面向?qū)ο缶幊痰恼Z(yǔ)法。

它的class和別的語(yǔ)言不一樣,它依舊是基于原型繼承的實(shí)現(xiàn),對(duì)語(yǔ)言的功能并沒(méi)有影響,只是方便了你的書(shū)寫(xiě)及閱讀

為什么說(shuō)ES6的class是語(yǔ)法糖

我們帶著問(wèn)題去閱讀下文:

  • 為什么說(shuō)ES6的class是語(yǔ)法糖?
  • class是原型的語(yǔ)法糖嗎?
  • 那又是如何使用原型來(lái)實(shí)現(xiàn)class這一語(yǔ)法糖的呢?

1. 基于Prototype的OOP

先來(lái)看一個(gè)prototype的例子:

function Person (name, sex) { 	this.name = name 	this.sex = sex }   function Man (name) { 	this.name = name }   Man.prototype = new Person('', 'male')   let Jy = new Man('Jy')   console.log(Jy.name, Jy.sex) // Jy, male
登錄后復(fù)制

這是我們使用原型的一個(gè)很簡(jiǎn)單的例子,Person具有名字和性別,Man是一個(gè)性別為男的Person,Jy是一個(gè)Man。我們先記住這一個(gè)例子,下面將使用class重寫(xiě)這個(gè)例子。

Tips: new, this等是Brendan Eich使之更像Java的OOP而加上的,有興趣的讀者可以自行查閱相關(guān)信息。

2. ES6 Class的OOP

class Person { 	constructor (name, sex) { 		this.name = name 		this.sex = sex 	} }   class Man extends Person { 	constructor (name) { 		super('', 'male') 		this.name = name 	} }   let Jy = new Man('Jy')   console.log(Jy.name, Jy.sex) // Jy, 'male'
登錄后復(fù)制

我們通過(guò)重寫(xiě)這個(gè)例子,采用了class、constructor、extends、super 這些單詞,接下來(lái)就具體來(lái)說(shuō)說(shuō)ES6規(guī)范中對(duì)它們做了什么。

3. 使用Prototype實(shí)現(xiàn)的Class OOP(ES6規(guī)范)

在ES6之前,JS對(duì)象其實(shí)就是屬性的集合,而屬性則是一組鍵值對(duì)(key, value),key可以是String or Symbol, value包括數(shù)據(jù)屬性特征值和訪問(wèn)器特征值。

你說(shuō)普通的屬性還好,不還有對(duì)象下面的方法嗎?怎么就變成了屬性的集合呢?

其實(shí)在ES5規(guī)范中出現(xiàn)的method的定義是“function that is the value of a property”,是對(duì)象的函數(shù)屬性而已,不能稱之為方法,直到ES6出現(xiàn),規(guī)范中才有Method Definitions。

我們能想到的在ES3有關(guān)OOP的東西: prototype、new、 this、 constructor、 instanceof, 甚至不是規(guī)范的 __proto__ 屬性。

所幸的是在ES5中我們?cè)黾恿撕芏喾椒▉?lái)補(bǔ)全它,使之完備:

  • Object.defineProperty
  • Object.freeze
  • Object.create
  • Object.getPrototypeOf
  • Object.setPrototypeOf
  • isPrototypeOf
  • ……

再來(lái)看一段代碼:

let obj = { 	name: 'Jy', 	speak () { // Note: it's not speak: function () {} 		console.log(this.name, super.name) 	} }   obj.speak() // Jy, undefined   Object.setPrototypeOf(obj,  { name: 'super' })   obj.speak() // Jy, super   let speak = obj.speak speak() // undefined, super
登錄后復(fù)制

obj.speak在ES6中定義已經(jīng)是Method了,它具有屬性[[homeObject]],homeObject指向方法被調(diào)用的對(duì)象(代碼中指的是obj), 它是綁定在對(duì)象中的Internal Slots,也就是你不能去修改,就相當(dāng)于寫(xiě)死了。

那么homeObject有什么用呢?它跟super密切相關(guān),當(dāng)解析到super這一關(guān)鍵字的時(shí)候就會(huì)找homeObject的prototype。

簡(jiǎn)單來(lái)說(shuō),總結(jié)為下面兩條公式:

  • let homeObj = Method[[HomeObject]] = obj
  • super = Object.getPrototypeOf(homeObj)

Note: homeObject是靜態(tài)綁定在internal slots中的,而super是動(dòng)態(tài)查找的。

講完super,我們來(lái)講講extends和constructor

class A extends B { }   class A extends B { 	constructor (...args) { 		super(args) 	} }   class C extends null { }
登錄后復(fù)制

extends主要做了以下兩件事:

  • Object.setPrototypeOf(A, B)
  • Object.setPrototypeOf(A.prototype, B.prototype)

如果父類是null, 則執(zhí)行Object.setPrototypeOf(C.prototype, null)

上述代碼的第一和第二部分區(qū)別在于有沒(méi)有顯示聲明constructor, 那么這兩段代碼是否等價(jià)呢?答案是等價(jià)的。

規(guī)范中就是這么定義的:

代碼的第三部分是繼承了null, 它不會(huì)報(bào)語(yǔ)法錯(cuò)誤,但是我們無(wú)法new一個(gè)C出來(lái),原因是new的時(shí)候會(huì)調(diào)用null的constructor,而null沒(méi)有constructor。

看到這里,ES6的class oop, 規(guī)范聲明都是使用原型來(lái)操作,所以我們是不是可以說(shuō)class是原型的語(yǔ)法糖了?

4. babel編譯后的class

我們實(shí)際項(xiàng)目中多采用babel來(lái)編譯ES6、7的代碼,所以這節(jié)我們就來(lái)分析以下babel編譯后的代碼,其中會(huì)省略一些報(bào)錯(cuò)、類型檢測(cè)的一些相關(guān)代碼來(lái)更好地呈現(xiàn)使用原型來(lái)實(shí)現(xiàn)OOP的主題。

編譯前:

class A extends B {}   console.log(new A)
登錄后復(fù)制

編譯后:

"use strict";   function _getPrototypeOf(o) {   _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {     return o.__proto__ || Object.getPrototypeOf(o);   };   return _getPrototypeOf(o); }   function _inherits(subClass, superClass) {   if (typeof superClass !== "function" && superClass !== null) {     throw new TypeError("Super expression must either be null or a function");   }   subClass.prototype = Object.create(superClass && superClass.prototype, {     constructor: {       value: subClass,       writable: true,       configurable: true     }   });   if (superClass) _setPrototypeOf(subClass, superClass); }   function _setPrototypeOf(o, p) {   _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {     o.__proto__ = p;     return o;   };   return _setPrototypeOf(o, p); }   var A =   /*#__PURE__*/   function (_B) {     _inherits(A, _B);       function A() {         return _getPrototypeOf(A).apply(this, arguments);     }       return A;   }(B);   console.log(new A());
登錄后復(fù)制

我們重點(diǎn)看_inherits 方法,跟我們上述說(shuō)的extends做的兩件事是一樣的:

  • Object.setPrototypeOf(subClass, superClass)
  • Object.setPrototypeOf(subClass.prototype, superClass.prototype)

只不過(guò)它采用的是Object.create方法,這兩個(gè)方法的區(qū)別可以去MDN上查看。

再看function A內(nèi)部,其實(shí)就是執(zhí)行了B的構(gòu)造器函數(shù)來(lái)達(dá)到super(arguments)的效果, 這個(gè)與規(guī)范:如果沒(méi)有顯示聲明constructor會(huì)自動(dòng)加上constructor是一致的。

5. 總結(jié)

至此,我們終于理解了為什么class是原型的語(yǔ)法糖以及如何使用原型來(lái)實(shí)現(xiàn)class這一語(yǔ)法糖。

但切記我們使用原型的目的并不是來(lái)模擬class oop的,prototype based的oop應(yīng)該用prototype去理解而不是class。

ES6的class oop 是不完備的 ,例如abstract class 、interface、private等都還沒(méi)有,不過(guò)有些功能已經(jīng)在提案中了,大家可以擁抱它,或者TypeScript是個(gè)不錯(cuò)的選擇,如果你的項(xiàng)目中使用到了TS, 歡迎你到評(píng)論區(qū)分享你的感受。

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
91久久久精品国产| 欧美日韩日本国产亚洲在线| 老鸭窝毛片一区二区三区| 久久香蕉国产| 久久香蕉国产| 国产精品日韩欧美一区| 国产精品女主播一区二区三区| 亚洲成人日韩| 视频在线观看国产精品| 蜜臀国产一区二区三区在线播放| 日韩精品一区第一页| 蜜臀精品久久久久久蜜臀| 日韩区欧美区| 免费不卡在线视频| 国产亚洲久久| 精品视频高潮| 久久久国产亚洲精品| 亚洲国产成人精品女人| 久久午夜精品| 国产一区 二区| 国产a亚洲精品| 亚洲一级影院| 免费黄网站欧美| 91麻豆精品激情在线观看最新 | 精品久久久中文字幕| 成人精品高清在线视频| 亚洲伦乱视频| 91成人网在线观看| 日韩高清一区| 久久97久久97精品免视看秋霞| 美女福利一区二区三区| 午夜久久黄色| 国产亚洲一区| 婷婷综合六月| 综合视频一区| 精品一区二区三区亚洲| 亚洲婷婷免费| 日韩二区三区四区| 国产+成+人+亚洲欧洲在线| 女人av一区| 欧美一级久久| 在线天堂资源www在线污| 成人午夜国产| 亚洲三级国产| 国产91在线播放精品| 久久福利影视| 久久亚洲精精品中文字幕| 在线日韩一区| 国产伦理久久久久久妇女| 久久精品主播| 欧美三区不卡| 欧美色图一区| 欧美日韩中文| 久久精品国产www456c0m| 五月国产精品| 麻豆mv在线观看| 亚洲精品人人| 成人国产精品一区二区免费麻豆| 国产美女精品| 精品亚洲a∨| 视频一区欧美精品| 国产精品成人a在线观看| 国产一区导航| 国产成人精品一区二区三区免费| 蜜桃视频在线观看一区二区| 精品国产一区二区三区噜噜噜| 日韩午夜av在线| 九九久久国产| 日韩高清一区二区| 美女少妇全过程你懂的久久| 日本不卡中文字幕| 久久久久亚洲| 国产精品视频一区视频二区| 亚洲美洲欧洲综合国产一区| 精品久久免费| 日韩久久99| 黑丝一区二区三区| 国产精品伦理久久久久久| 亚洲精品一级| 欧美日韩精品免费观看视频完整| 精品香蕉视频| 国产日韩一区二区三免费高清 | 国产精品日韩精品在线播放| 奶水喷射视频一区| 丁香婷婷久久| 91亚洲无吗| 老司机精品久久| 亚洲福利专区| 蜜臀国产一区| 日本精品黄色| 97久久亚洲| 免费人成在线不卡| av一区二区高清| 色一区二区三区| 久久久久久亚洲精品美女| 日韩欧美美女在线观看| 亚洲一区成人| 亚洲天堂久久| 韩国精品主播一区二区在线观看 | 亚洲永久av| 精品久久久网| 欧美极品中文字幕| 欧美一级二区| 日韩av中文字幕一区二区| 亚洲资源av| 午夜国产一区二区| 亚洲天堂黄色| 国产一区亚洲| 国产超碰精品| 日本美女一区| 另类专区亚洲| 精品美女在线视频| 国产精品xxxav免费视频| 日韩精品乱码av一区二区| 亚洲资源在线| 亚洲精品在线国产| 亚洲精品成a人ⅴ香蕉片| 日韩在线一区二区| 亚洲伊人精品酒店| 快she精品国产999| 男人的天堂亚洲一区| 视频在线观看一区| 亚洲视频电影在线| 亚洲日韩中文字幕一区| 亚洲伊人精品酒店| 亚洲三区欧美一区国产二区| 麻豆91精品| 蜜桃av一区二区三区电影| 免费中文字幕日韩欧美| 免费人成网站在线观看欧美高清| 亚洲丝袜啪啪| 日本在线观看不卡视频| 日本精品一区二区三区在线观看视频| 午夜精品影视国产一区在线麻豆| 日韩精品免费视频人成| 国产精品一区二区三区美女| 国产精品v日韩精品v欧美精品网站| 麻豆精品一区二区综合av| 福利一区和二区| 欧美日韩免费观看视频| 韩日一区二区三区| 最新日韩欧美| 亚洲综合福利| 国产乱码精品一区二区三区四区 | 久久中文字幕二区| 99热精品在线| 亚洲va久久久噜噜噜久久| 91久久精品无嫩草影院| 麻豆视频久久| 日韩伦理在线一区| 91精品高清| 日韩黄色在线观看| 精品资源在线| 亚洲一级二级| 日本一不卡视频| 精品亚洲成人| av亚洲在线观看| 日韩精品视频网站| 成人在线视频免费看| 激情丁香综合| 日韩激情视频网站| 成人一区而且| 国产一区导航| 国产精品久久久久毛片大屁完整版| 精品国产乱码久久久| 欧美不卡高清一区二区三区| 99日韩精品| 麻豆国产精品777777在线| 欧美成人基地 | 老牛国内精品亚洲成av人片| sm久久捆绑调教精品一区| 激情五月综合| 亚洲精选91| 国产成人精品一区二区免费看京| 一区二区三区视频免费观看| 日韩精品欧美大片| 91嫩草亚洲精品| 久久国产成人| 激情久久99| 久久亚洲视频| 国产伦久视频在线观看| 国产精品毛片在线看| 国产精品va视频| 亚洲精品在线观看91| 欧美日韩亚洲一区二区三区在线| av资源亚洲| 日韩国产在线观看| 伊伊综合在线| 亚洲三级观看| 日韩国产在线| 日韩综合小视频| 日韩精品不卡一区二区| 亚洲精品黄色| 伊人久久高清| 亚洲在线电影| 日韩免费av| 欧美一级网址| 99国产精品久久久久久久| 成人在线视频中文字幕| 视频一区日韩精品|