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

站長資訊網
最全最豐富的資訊網站

es6 class是語法糖嗎

class是語法糖。原因:class是基于原型繼承的實現,對語言的功能并沒有什么影響,只是方便了語法的書寫及閱讀;class的本質是function,能夠讓對象原型的寫法更加清晰,更像面向對象編程的語法。

es6 class是語法糖嗎

前端(vue)入門到精通課程:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調試工具:點擊使用

本教程操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

ES6 class類——語法糖

class (類)作為對象的模板被引入,可以通過 class 關鍵字定義類。它的本質是函數(function),可以看作一個語法糖,讓對象原型的寫法更加清晰、更像面向對象編程的語法。

它的class和別的語言不一樣,它依舊是基于原型繼承的實現,對語言的功能并沒有影響,只是方便了你的書寫及閱讀

為什么說ES6的class是語法糖

我們帶著問題去閱讀下文:

  • 為什么說ES6的class是語法糖?
  • class是原型的語法糖嗎?
  • 那又是如何使用原型來實現class這一語法糖的呢?

1. 基于Prototype的OOP

先來看一個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
登錄后復制

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

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

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'
登錄后復制

我們通過重寫這個例子,采用了class、constructor、extends、super 這些單詞,接下來就具體來說說ES6規范中對它們做了什么。

3. 使用Prototype實現的Class OOP(ES6規范)

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

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

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

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

所幸的是在ES5中我們增加了很多方法來補全它,使之完備:

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

再來看一段代碼:

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
登錄后復制

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

那么homeObject有什么用呢?它跟super密切相關,當解析到super這一關鍵字的時候就會找homeObject的prototype。

簡單來說,總結為下面兩條公式:

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

Note: homeObject是靜態綁定在internal slots中的,而super是動態查找的。

講完super,我們來講講extends和constructor

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

extends主要做了以下兩件事:

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

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

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

規范中就是這么定義的:

代碼的第三部分是繼承了null, 它不會報語法錯誤,但是我們無法new一個C出來,原因是new的時候會調用null的constructor,而null沒有constructor。

看到這里,ES6的class oop, 規范聲明都是使用原型來操作,所以我們是不是可以說class是原型的語法糖了?

4. babel編譯后的class

我們實際項目中多采用babel來編譯ES6、7的代碼,所以這節我們就來分析以下babel編譯后的代碼,其中會省略一些報錯、類型檢測的一些相關代碼來更好地呈現使用原型來實現OOP的主題。

編譯前:

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

編譯后:

"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());
登錄后復制

我們重點看_inherits 方法,跟我們上述說的extends做的兩件事是一樣的:

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

只不過它采用的是Object.create方法,這兩個方法的區別可以去MDN上查看。

再看function A內部,其實就是執行了B的構造器函數來達到super(arguments)的效果, 這個與規范:如果沒有顯示聲明constructor會自動加上constructor是一致的。

5. 總結

至此,我們終于理解了為什么class是原型的語法糖以及如何使用原型來實現class這一語法糖。

但切記我們使用原型的目的并不是來模擬class oop的,prototype based的oop應該用prototype去理解而不是class。

ES6的class oop 是不完備的 ,例如abstract class 、interface、private等都還沒有,不過有些功能已經在提案中了,大家可以擁抱它,或者TypeScript是個不錯的選擇,如果你的項目中使用到了TS, 歡迎你到評論區分享你的感受。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
日韩中文字幕1| 国产尤物精品| 综合激情一区| 久久香蕉精品| 首页亚洲欧美制服丝腿| 国产亚洲精品久久久久婷婷瑜伽| 亚洲激情中文在线| 欧美精选一区二区三区| 久久久久久网| 理论片午夜视频在线观看| 国产一区二区三区四区| 卡一卡二国产精品| 成人免费一区| 国产黄大片在线观看| 成人国产精品一区二区免费麻豆| 丰满少妇一区| 久久精品免费一区二区三区| 久久精品高清| 日韩视频二区| 亚洲三级观看| 国产日韩免费| 成人污污视频| 久久久精品午夜少妇| 成人片免费看| 亚洲电影在线一区二区三区| 久久香蕉精品| 国产精品调教| yellow在线观看网址| 99久久久久国产精品| 国产精品美女久久久| 色综合视频一区二区三区日韩| 欧美亚洲国产日韩| 91综合网人人| 午夜在线观看免费一区| 日韩精品三区四区| 狠狠久久伊人| 欧美精品黄色| 日韩av成人高清| 麻豆极品一区二区三区| 欧美成人a交片免费看| 精品中文字幕一区二区三区av| 日本欧洲一区二区| 国产欧美午夜| 欧美13videosex性极品| 在线亚洲激情| 国产精品一页| 色在线中文字幕| 男女性色大片免费观看一区二区| 青青国产精品| 91看片一区| 亚洲在线久久| 91欧美国产| 亚洲日本国产| 久久久久伊人| 欧美特黄一级| 国产精品一区免费在线| 久久精品二区三区| 69堂免费精品视频在线播放| 日韩伦理在线一区| 日韩激情网站| 日韩精品首页| 911精品国产| 免费国产自久久久久三四区久久| 欧美日韩一视频区二区| 精品欧美一区二区三区在线观看| 亚洲三级视频| 精品成人免费一区二区在线播放| 亚洲毛片一区| 日韩av有码| 亚洲日本欧美| 99免费精品| 国产精品99精品一区二区三区∴| 好吊日精品视频 | 欧美1级日本1级| 国产伦精品一区二区三区在线播放| 在线日韩一区| 开心激情综合| 天海翼亚洲一区二区三区| 日韩毛片视频| 国产精品66| 免费人成在线不卡| 成人国产精品一区二区网站| 亚洲精品伊人| 国产中文一区| 里番精品3d一二三区| 三级欧美在线一区| 亚洲91精品| 久久久精品国产**网站| 日韩激情网站| 免费久久精品视频| 私拍精品福利视频在线一区| 久久精品国产免费| 日韩精品久久理论片| 欧美中文一区二区| 国产在线观看91一区二区三区| 色狠狠一区二区三区| 午夜国产精品视频免费体验区| a国产在线视频| 国产精品黄色片| 91精品国产自产精品男人的天堂| 蜜臀va亚洲va欧美va天堂 | 高清日韩欧美| 国产精品chinese| 日韩国产精品久久久久久亚洲| 欧美在线资源| 亚洲成人二区| 中文字幕在线视频久| 久久av电影| 国产精品一页| 欧美一区在线观看视频| 美美哒免费高清在线观看视频一区二区| 久久黄色影院| 日韩精品一卡| 成人久久一区| 99视频精品全国免费| 成人va天堂| 香蕉成人av| 日本免费久久| 日韩精品一卡| av一区二区高清| 九九综合九九| 亚洲激情中文| 欧美日韩精品免费观看视频完整| 蜜桃成人av| 亚洲91视频| 蜜桃成人av| 国产精品女主播一区二区三区| 亚洲精品888| 丝袜脚交一区二区| 日韩精品一级二级 | 亚洲欧美网站在线观看| 亚洲理论在线| 日本精品久久| 国产精品免费精品自在线观看| 91精品国产自产观看在线| 国产精品一区二区美女视频免费看| 国产区精品区| 国产日产高清欧美一区二区三区| 欧美日韩亚洲一区三区| 国产美女久久| 久久精品免费看| 亚洲一区资源| 日韩午夜电影| 亚洲精品在线二区| 欧美国产极品| 亚洲精品在线影院| 亚洲欧美日韩一区在线观看| 免费国产亚洲视频| 日本不卡一区二区| 美女国产一区二区三区| 日韩精品免费一区二区三区| 美女国产精品| 青草久久视频| 精品国产a一区二区三区v免费| 久久久久国产精品一区三寸| 99在线观看免费视频精品观看| 蜜臀av一区二区在线免费观看 | 日韩精品亚洲aⅴ在线影院| 国产精品香蕉| 另类中文字幕国产精品| 亚洲激情不卡| 日韩欧美中文字幕一区二区三区| 国产亚洲久久| 久久亚洲资源中文字| 91精品国产调教在线观看| 在线视频精品| 国产精品巨作av| 久久久久国产一区二区| 日韩中文字幕区一区有砖一区| 国产精品一在线观看| 欧美sss在线视频| 一区二区三区四区日韩| 欧美国产视频| 欧美精品九九| 国产精品www994| 久久蜜桃av| 日韩国产在线观看一区| 国产 日韩 欧美 综合 一区| 亚洲先锋成人| 国产日韩一区二区三区在线| a天堂资源在线| 中文字幕av亚洲精品一部二部 | 高清一区二区三区av| 一区在线免费观看| 国产欧美三级| 久久高清免费| 国产欧美91| 欧美久久精品一级c片| 欧美在线91| 欧美日韩精品一区二区视频| 日韩不卡一区二区| 欧美成人a交片免费看| 亚洲一二av| 中文在线资源| 欧美亚洲综合视频| 黄色亚洲大片免费在线观看| 欧美xxxx性| 亚洲欧美日韩精品一区二区| 福利在线一区| 青青草伊人久久|