亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

利用es6 new.target來對模擬抽象類的方法

2019-11-19 11:36:36
字體:
來源:轉載
供稿:網友

起源

最近在使用 Symbol 來做為唯一值,發現 Symbol 無法進行 new 操作,只能當作函數使用,只要進行了new 就會發生類型錯誤

new Symbol()// errorUncaught TypeError: Symbol is not a constructor  at new Symbol (<anonymous>)  at <anonymous>:1:1

在不考慮底層實現的情況下,在代碼層面是否能夠實現一個函數只可以進行調用而不可以進行 new 操作呢?思考之后如下寫出:

function disConstructor() { if (this !== window) {  throw new TypeError(' disConstructor is not a constructor') } console.log('gogo go')}// 測試結果如下disConstructor() // gogo gonew disConstructor()// errorUncaught TypeError: disConstructor is not a constructor  at new disConstructor (<anonymous>:3:15)  at <anonymous>:1:1

如果使用 nodejs,window 可以切換為 global, 代碼運行結果不變,因為對于個人而言沒有適用場景。于是就沒有繼續研究下去,可是最近在從新翻閱 es6 時候發現 new.target這個屬性。

new.target 屬性

介紹(引用 mdn 文檔)

new.target屬性允許你檢測函數或構造方法是否是通過new運算符被調用的。

在通過new運算符被初始化的函數或構造方法中,new.target返回一個指向構造方法或函數的引用。在普通的函數調用中,new.target 的值是undefined。

這樣的話 我們的代碼就可以這樣改為

function disConstructor() { // 普通的函數調用中,new.target 的值是undefined。 if (new.target) {  throw new TypeError(' disConstructor is not a constructor') } console.log('gogo go')}

得到與上述代碼一樣的答案。

深入

難道 es6 特地添加的功能僅僅只能用于檢查一下我們的函數調用方式嗎?

在查閱的過程各種發現了大多數都方案都是用 new.target 寫出只能被繼承的類。類似于實現java的抽象類。

class Animal { constructor(name, age) {  if (new.target === Animal) {   throw new Error('Animal class can`t instantiate');  }  this.name = name  this.age = age } // 其他代碼 ...}class Dog extends Animal{ constructor(name, age, sex) {  super(name, age)  this.sex = sex }}new Animal()// errorUncaught Error: Animal class can`t instantiate  at new Animal (<anonymous>:4:13)  at <anonymous>:1:1new Dog('mimi', 12, '公')// Dog {name: "mimi", age: 12, sex: "公"}

但是 java抽象類抽象方法需要重寫,這個是沒有方案的。于是在測試與使用的過程中,卻意外發現了超類可以在構造期間訪問派生類的原型,利用起來。

class Animal { constructor(name, age) {  console.log(new.target.prototype) } // 其他代碼 ...}

之前運行時調用需要重寫的方法報錯是這樣寫的。

class Animal { constructor(name, age) {  this.name = name  this.age = age } getName () {  throw new Error('please overwrite getName method') }}class Dog extends Animal{ constructor(name, age, sex) {  super(name, age)  this.sex = sex }}const pite = new Dog('pite', 2, '公')a.getName()// errorUncaught Error: please overwrite getName method  at Dog.getName (<anonymous>:8:11)  at <anonymous>:1:3

然而此時利用 new.target ,我就可以利用 構造期間 對子類進行操作報錯。

class Animal { constructor(name, age) {  // 如果 target 不是 基類 且 沒有 getName 報錯  if (new.target !== Animal && !new.target.prototype.hasOwnProperty('getName')) {   throw new Error('please overwrite getName method')  }  this.name = name  this.age = age }}class Dog extends Animal{ constructor(name, age, sex) {  super(name, age)  this.sex = sex }}const pite = new Dog('pite', 2, '公')// errorUncaught Error: please overwrite getName method  at new Animal (<anonymous>:5:13)  at new Dog (<anonymous>:14:5)  at <anonymous>:1:1

此時可以把運行方法時候發生的錯誤提前到構造時期,雖然都是在運行期,但是該錯誤觸發機制要早危害要大。反而對代碼是一種保護。

當然了,利用超類可以在構造期間訪問派生類的原型作用遠遠不是那么簡單,必然是很強大的,可以結合業務場景談一談理解和作用。

其他方案

  • 增加 編輯器插件
  • proxy
  • 修飾器

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩一区在线视频| 亚洲美女精品成人在线视频| 成人免费淫片aa视频免费| 在线播放日韩精品| 国产成人福利网站| 人人爽久久涩噜噜噜网站| 久久亚洲精品视频| 97精品一区二区视频在线观看| 国产偷国产偷亚洲清高网站| 亚洲天堂免费在线| 91精品综合久久久久久五月天| 亚洲www永久成人夜色| 国产一区二区三区网站| 久久精品国产一区二区电影| 亚洲综合中文字幕68页| 日韩经典中文字幕在线观看| 久久视频免费在线播放| 成人性生交大片免费观看嘿嘿视频| 久久人人爽人人爽人人片亚洲| 精品国偷自产在线视频99| 亚洲加勒比久久88色综合| 欧美一区二区三区免费观看| 日韩亚洲精品视频| 欧美一二三视频| 久久资源免费视频| 日韩国产欧美区| 久久精品视频导航| 亚洲欧洲偷拍精品| 2019中文在线观看| 中文欧美在线视频| 欧美电影免费在线观看| www.亚洲人.com| 伦理中文字幕亚洲| 日韩毛片中文字幕| 国产精品欧美激情在线播放| 97热精品视频官网| 美女久久久久久久久久久| 夜夜嗨av一区二区三区免费区| 538国产精品一区二区免费视频| 欧美黑人又粗大| 日韩欧美国产视频| 精品无码久久久久久国产| 日韩亚洲第一页| 有码中文亚洲精品| 国产亚洲精品一区二区| 伦理中文字幕亚洲| 亚洲精品视频二区| 欧美一级免费视频| 欧美日韩性生活视频| 久久人人爽人人爽爽久久| 色播久久人人爽人人爽人人片视av| 亚洲男人第一网站| 久久久999国产| 亚洲精品成人av| 日本免费久久高清视频| 91久久久久久久久久| 国产成人91久久精品| 亚洲天堂av电影| 一区二区三区回区在观看免费视频| 国产在线98福利播放视频| 日韩成人在线视频观看| 久久久久99精品久久久久| 午夜精品久久久久久久男人的天堂| 欧美一级片一区| 538国产精品一区二区在线| 日韩精品黄色网| 国产精品91久久| 亚洲精品免费在线视频| 欧美高清视频在线观看| 久久久成人精品| 亚洲精品电影网站| 97在线视频免费播放| 亚洲欧美日韩视频一区| 精品欧美激情精品一区| 97精品伊人久久久大香线蕉| 国产99视频在线观看| 一区二区三区无码高清视频| 国产91精品久久久久久久| 91精品国产综合久久香蕉| 欧美激情在线狂野欧美精品| 国产精品1区2区在线观看| 精品成人69xx.xyz| 美女久久久久久久| 午夜精品福利在线观看| 爱福利视频一区| 91精品国产综合久久久久久久久| 亚洲娇小xxxx欧美娇小| 久久69精品久久久久久久电影好| 日韩av电影在线免费播放| 亚洲一区二区三区成人在线视频精品| 91av国产在线| 中文字幕九色91在线| 国产成人精品久久二区二区91| 国模精品视频一区二区三区| 欧美一级在线亚洲天堂| 色婷婷综合久久久久| 日韩中文字幕精品视频| 91夜夜未满十八勿入爽爽影院| 中文字幕欧美日韩精品| 国产精品欧美一区二区三区奶水| 亚洲bt欧美bt日本bt| 国产一区二区三区毛片| 一区二区中文字幕| 精品中文字幕在线观看| 国产免费观看久久黄| 欧美野外wwwxxx| 全亚洲最色的网站在线观看| 91国产视频在线播放| 成人欧美一区二区三区黑人孕妇| 欧美成人精品激情在线观看| 日韩亚洲欧美成人| 久久久久久伊人| 九九九久久国产免费| 日本高清视频精品| 亚洲精品国产精品久久清纯直播| 欧美激情一区二区三区高清视频| 精品亚洲一区二区三区在线播放| 亚洲韩国日本中文字幕| 成人精品一区二区三区| 亚洲第一免费播放区| 日本在线精品视频| 欧美性猛交xxxx免费看| 日韩精品免费在线播放| 这里只有精品视频| 91精品国产91久久久久| 亚洲国产成人精品电影| 欧美在线亚洲一区| 国产精品吹潮在线观看| 91免费在线视频| 亚洲精品福利视频| 精品日韩中文字幕| 国产精品久久久久久久久久99| 亚洲成**性毛茸茸| 精品成人国产在线观看男人呻吟| 国产精自产拍久久久久久蜜| 亚洲激情免费观看| 黑丝美女久久久| 97av在线播放| 91av在线免费观看视频| 国产91精品不卡视频| 国产精品亚发布| 91精品国产91| 欧美日韩激情视频8区| 精品久久久久久中文字幕大豆网| 8050国产精品久久久久久| 欧美激情亚洲综合一区| 最近的2019中文字幕免费一页| 福利视频第一区| 国产偷国产偷亚洲清高网站| 亚洲xxxx在线| 青青草原成人在线视频| 日韩电影免费观看中文字幕| 亚洲国产精彩中文乱码av在线播放| 国产精品久久电影观看| 日韩中文字在线| 国产日韩欧美电影在线观看| 狠狠躁夜夜躁人人爽天天天天97| 91中文精品字幕在线视频| 久久亚洲国产成人| 日韩在线中文字幕| 国产精品96久久久久久又黄又硬| 亚洲第一黄色网| 精品国产鲁一鲁一区二区张丽| 国产精品三级网站|