精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么在JavaScript中使用getter和setter是一個壞主意

開發(fā) 前端 開發(fā)工具
如你所知,getter和setter已經(jīng)成為了JavaScript的一部分。它們廣泛支持所有的主流瀏覽器,甚至是IE8。但我認為它不是非常適合JavaScript。

[[196708]]

如你所知,getter和setter已經(jīng)成為了JavaScript的一部分。它們廣泛支持所有的主流瀏覽器,甚至是IE8。

我不認為這個點子通常是錯誤的,但我認為它不是非常適合JavaScript。可能看起來getter和setter可以簡化代碼和節(jié)省時間,但其實它們會帶來隱藏錯誤,并且這些錯誤***眼看并不明顯。

getter和setter如何工作?

首先小小地總結(jié)一下這些是什么東西:

有時候,我們希望能允許訪問一個會返回動態(tài)計算值的屬性,或者你可能想要反映內(nèi)部變量的狀態(tài),而不使用顯式的方法調(diào)用。

為了說明它們是如何工作的,讓我們來看一個有著兩個屬性的person對象,這兩個屬性為:firstName和lastName,以及一個計算值:fullName。

  1. var obj = { 
  2.  
  3.   firstName: "Maks"
  4.  
  5.   lastName: "Nemisj" 
  6.  
  7.  

計算值fullName會返回firstName和lastName兩者的串聯(lián)。

  1. Object.defineProperty(person, 'fullName', { 
  2.  
  3.   get: function () { 
  4.  
  5.     return this.firstName + ' ' + this.lastName; 
  6.  
  7.   } 
  8.  
  9. });  

為了得到fullName的計算值,不需要像person.fullName()帶可怕的括號,只需要使用簡單的var fullName = person.fullName。

這同樣適用于setter,你可以通過使用函數(shù)設(shè)置值:

  1. Object.defineProperty(person, 'fullName', { 
  2.  
  3.   setfunction (value) { 
  4.  
  5.     var names = value.split(' '); 
  6.  
  7.     this.firstName = names[0]; 
  8.  
  9.     this.lastName = names[1]; 
  10.  
  11.   } 
  12.  
  13. });  

使用就和getter一樣簡單:person.fullName = ‘Boris Gorbachev’。這將調(diào)用上面定義的函數(shù),并分離Boris Gorbachev成firstName和lastName。

問題在哪里?

你也許在想:“嘿,我喜歡getter和setter方法,它們感覺更自然,就像JSON一樣。”你說得對,它們的確是這樣的,但是我們先退一步來看一看fullName在getter和setter之前是如何工作的。

為得到值,我們將使用類似于getFullName()的一些東西,以及為了設(shè)置值,我們將使用person.setFullName(‘Maks Nemisj’)。

如果拼錯函數(shù)名,person.getFullName()寫成person.getFulName()會發(fā)生什么呢?

JavaScript會給出一個錯誤:

  1. person.getFulName(); 
  2.  
  3.        ^ 
  4.  
  5. TypeError: undefined is not a function  

這個錯誤會在適當?shù)臅r候適當?shù)牡胤奖挥|發(fā)。訪問函數(shù)不存在的對象將觸發(fā)錯誤——這是好的。

現(xiàn)在,讓我們來看看當用錯誤的名稱來使用setter的時候會發(fā)生什么?

  1. person.fulName = 'Boris Gorbachev'

什么也沒有。對象是可擴展的,可以動態(tài)分配鍵和值,因此不會有錯誤在運行時被拋出。

這樣的行為意味著錯誤可能顯示在用戶界面上的某個地方,或者,當某些操作被執(zhí)行在錯誤的值上時,而并非是打字錯誤的時刻。

跟蹤應(yīng)該發(fā)生在過去但卻顯示在將來的代碼流上的錯誤是如此有意思。

seal行不行

這個問題可以通過sealAPI來部分解決。只要對象是密封的,它就不能突變,也就是意味著fulName將試圖分配一個新鍵到person對象,并且它會失敗。

出于某種原因,當我在Node.js V4.0測試這個的時候,它沒有按照我期待的那樣工作。所以,我不能確保這個解決方案。

而更令人沮喪的是,對于setter一點也沒有解決方法。正如我前面提到的,對象是可擴展和可故障保護的,這意味著訪問一個不存在的鍵不會導(dǎo)致任何錯誤。

如果這種情況只適用于對象的文字的話,我不會多此一舉地寫這篇文章,但在ECMAScript 2015(ES6)和用類定義getter和setter能力的興起之后,我決定寫下關(guān)于潛在陷阱的博客。

類的到來

我知道當前類在一些JavaScript社區(qū)不是非常受歡迎。人們對在函數(shù)式/基于原型的語言,例如JavaScript中是否需要它們,爭執(zhí)不休。然而,事實是,類就在ECMAScript 2015(ES6)規(guī)范說明中,并且將存在于此一段時間。

對我來說,類是指定在類的外部世界(消費者)和應(yīng)用程序的內(nèi)部世界之間的定義良好的API的一種方式。這就是白紙黑字放入規(guī)則的抽象,并且我們假定這些規(guī)則不會很快改變。

改進person對象,做一個它的real類。person定義了接口用于獲取和設(shè)置fullName。

  1. class Person { 
  2.  
  3.   constructor(firstName, lastName) { 
  4.  
  5.     this.firstName = firstName; 
  6.  
  7.     this.lastName = lastName; 
  8.  
  9.   } 
  10.  
  11.   getFullName() { 
  12.  
  13.     return this.firstName + ' ' + this.lastName; 
  14.  
  15.   } 
  16.  
  17.   setFullName(value) { 
  18.  
  19.     var names = value.split(' '); 
  20.  
  21.     this.firstName = names[0]; 
  22.  
  23.     this.lastName = names[1]; 
  24.  
  25.   } 
  26.  
  27.  

類定義了一個嚴格的接口描述,但getter和setter方法使其變得不太嚴格。我們已經(jīng)習慣了臃腫的錯誤,當工作于對象文字和JSON時的鍵中出現(xiàn)拼寫錯誤的時候。我希望至少類能夠更嚴格,并且在這個意義上,提供更好的反饋給開發(fā)人員。

雖然這種情況在定義getter和setter在一個類上的時候沒有任何不同。但它不會阻止任何人拼錯。

  1. class Person { 
  2.  
  3.   constructor(firstName, lastName) { 
  4.  
  5.     this.firstName = firstName; 
  6.  
  7.     this.lastName = lastName; 
  8.  
  9.   } 
  10.  
  11.   get fullName() { 
  12.  
  13.     return this.firstName + ' ' + this.lastName; 
  14.  
  15.   } 
  16.  
  17.   set fullName(value) { 
  18.  
  19.     var names = value.split(' '); 
  20.  
  21.     this.firstName = names[0]; 
  22.  
  23.     this.lastName = names[1]; 
  24.  
  25.   } 
  26.  
  27.  

有拼寫錯誤的執(zhí)行不會給出任何錯誤:

  1. var person = new Person('Maks''Nemisj'); 
  2.  
  3. console.log(person.fulName);  

同樣不嚴格,不冗長,不可追蹤的行為導(dǎo)致可能會出錯。

在我發(fā)現(xiàn)這一點后,我有一個問題:在使用getter和setter的時候,有沒有什么可以做的,以便于使得類更嚴格?我發(fā)現(xiàn):有是肯定有,但是這值得嗎?增加額外層次的復(fù)雜性到代碼就只是為了使用數(shù)量更少的括號?對于API定義,也可以不使用getter和setter,而這樣一來就能解決這個問題。除非你是一個鐵桿開發(fā)人員,并愿意繼續(xù)進行,不然還有另一種解決方案,如下所述。

proxy來幫助?

除了getter和setter方法,ECMAScript 2015(ES6)還自帶proxy對象。proxy可以幫助你確定委托方法,這些委托方法可以在實際訪問鍵執(zhí)行之前,用來執(zhí)行各種操作。事實上,它看起來像動態(tài)getter / setter方法。

proxy對象可以用來捕捉任何到類的實例的訪問,并且如果在類中沒有找到預(yù)先定義的getter或setter就會拋出錯誤。

為了做到這一點,必須執(zhí)行下面兩個操作:

  • 創(chuàng)建基于Person原型的getter和setter清單。
  • 創(chuàng)建將測試這些清單的Proxy對象。

讓我們來實現(xiàn)它。

首先,為了找出什么樣的getter和setter方法可以用在類Person上,可以使用getOwnPropertyNames和getOwnPropertyDescriptor:

  1. var names = Object.getOwnPropertyNames(Person.prototype); 
  2.  
  3. var getters = names.filter((name) => { 
  4.  
  5.   var result =  Object.getOwnPropertyDescriptor(Person.prototype, name); 
  6.  
  7.   return !!result.get; 
  8.  
  9. }); 
  10.  
  11. var setters = names.filter((name) => { 
  12.  
  13.   var result =  Object.getOwnPropertyDescriptor(Person.prototype, name); 
  14.  
  15.   return !!result.set
  16.  
  17. });  

在此之后,創(chuàng)建一個Proxy對象:

  1. var handler = { 
  2.  
  3.   get(target, name) { 
  4.  
  5.     if (getters.indexOf(name) != -1) { 
  6.  
  7.       return target[name]; 
  8.  
  9.     } 
  10.  
  11.     throw new Error('Getter "' + name + '" not found in "Person"'); 
  12.  
  13.   }, 
  14.  
  15.   set(target, name) { 
  16.  
  17.     if (setters.indexOf(name) != -1) { 
  18.  
  19.       return target[name]; 
  20.  
  21.     } 
  22.  
  23.     throw new Error('Setter "' + name + '" not found in "Person"'); 
  24.  
  25.   } 
  26.  
  27. }; 
  28.  
  29. person = new Proxy(person, handler);  

現(xiàn)在,只要你嘗試訪問person.fulName,就會顯示Error: Getter “fulName” not found in “Person”的消息。

希望這篇文章可以幫助你全面了解getter和setter方法,以及它們將會帶到代碼中的危險。 

責任編輯:龐桂玉 來源: 前端大全
相關(guān)推薦

2021-06-24 12:46:40

數(shù)據(jù)管理模型

2023-09-18 14:54:02

2021-08-31 10:01:04

JavaScript函數(shù)屬性

2020-08-02 22:42:25

JavaScript開發(fā)

2015-06-08 13:19:11

JavaScriptgettersetter

2016-03-25 10:11:57

BYOD自帶設(shè)備

2009-06-29 17:03:41

自動生成Getter和Eclipse

2021-07-27 07:12:11

Getter接口Setter

2025-01-15 09:06:58

CSSRegEx前端

2023-12-04 08:28:35

Docker容器

2015-04-17 16:44:22

swiftOC

2015-08-03 11:45:37

storyboard

2024-11-26 08:30:33

2012-01-04 13:55:23

Canvas

2021-07-30 15:31:35

代碼重用漏洞攻擊

2015-07-28 11:22:30

大數(shù)據(jù)浪潮

2022-01-03 08:06:15

函數(shù)Go數(shù)據(jù)

2021-10-13 14:06:46

MySQLUtf8符號

2012-04-11 10:39:32

Eclipse

2023-05-16 15:32:45

JavaScriptWeb前端工程師
點贊
收藏

51CTO技術(shù)棧公眾號

欧美老女人性开放| 亚洲国产成人精品激情在线| 青青在线精品| 亚洲色大成网站www久久九九| 91亚洲精品久久久| 在线看成人av| 精品久久久久中文字幕小说| 在线不卡中文字幕| 日日摸日日碰夜夜爽无码| 欧美日韩伦理片| 国产制服丝袜一区| 欧美夜福利tv在线| 男人操女人的视频网站| 日韩欧美久久| 在线观看日韩高清av| 超碰超碰超碰超碰超碰| 久草视频在线看| 国产v日产∨综合v精品视频| 国产精品第一页在线| 69精品久久久| 日本在线电影一区二区三区| 亚洲国产黄色片| 色一情一区二区| 97se综合| 亚洲高清免费在线| 亚洲一区精彩视频| 日本又骚又刺激的视频在线观看| 国产麻豆精品95视频| 国产精品高潮呻吟久久av野狼| 激情五月婷婷小说| 成人嫩草影院| 亚洲欧美另类人妖| 在线观看免费视频国产| 国产精久久久| 欧美日韩精品一区视频| 国产极品美女高潮无套久久久| 四季久久免费一区二区三区四区| 中文久久乱码一区二区| 欧美日韩亚洲一区二区三区在线观看 | www视频在线| 蜜臀国产一区二区三区在线播放| 韩国福利视频一区| 久久午夜无码鲁丝片| 羞羞色午夜精品一区二区三区| 亚洲乱码一区av黑人高潮| www.四虎精品| 91久久偷偷做嫩草影院电| 欧美日韩一级片在线观看| 日韩av一二三四| 自拍网站在线观看| 激情av一区二区| 国产精品又粗又长| 欧美人与动牲性行为| 亚洲欧美日韩成人高清在线一区| 超碰成人在线免费观看| 麻豆视频在线播放| 国产精品久久国产精麻豆99网站| 久久精品国产一区二区三区不卡| 中文字幕永久免费视频| 日韩av成人高清| 国产精品美女免费视频| 国语对白一区二区| 激情欧美一区| 午夜精品久久久久久99热| 久久综合激情网| 亚洲第一在线| 欧美性视频在线| 国产无遮挡呻吟娇喘视频| 亚洲深夜影院| 国产97在线|亚洲| 一区二区视频免费观看| 久久 天天综合| 亚洲最大成人免费视频| 性生交生活影碟片| 成人激情免费电影网址| 国内外成人免费视频| 日韩一区二区三区不卡| 久久蜜臀精品av| 视频一区二区三区免费观看| 麻豆视频网站在线观看| 一卡二卡三卡日韩欧美| 国产一级爱c视频| 国产综合色区在线观看| 欧美特级限制片免费在线观看| 黄大色黄女片18第一次| 最新国产精品精品视频| 国产视频精品一区二区三区| 韩国三级hd中文字幕| 亚洲国产日韩欧美在线| 欧美成人全部免费| 狠狠躁夜夜躁人人爽天天高潮| 久久精品一区二区国产| 成人a在线观看| 亚洲乱码国产乱码精品精软件| 91日韩精品一区| 亚洲美女搞黄| 波多野结衣在线观看| 色av综合在线| www.四虎精品| 色135综合网| 国内精品久久久久影院 日本资源| 成人毛片在线播放| 国产伦精品一区二区三区免费迷 | 国产精品久线在线观看| 免费在线精品视频| 天堂av在线网| 欧美一级艳片视频免费观看| 最新中文字幕视频| 亚洲成人av| 国产成人精品日本亚洲专区61| 国产视频手机在线观看| 久久婷婷国产综合国色天香| 8x8x华人在线| 成人福利一区二区| 精品亚洲国产成av人片传媒| 亚洲xxxx3d动漫| 老司机精品导航| 国产福利久久| 黄色网址在线免费播放| 色诱亚洲精品久久久久久| av在线天堂网| 国产精品黑丝在线播放| 国产成人精品一区| 日韩性xxxx| 亚洲一级二级三级在线免费观看| 国产精品一区二区小说| 亚洲免费观看高清完整版在线观| 欧美福利小视频| 国产伦一区二区| 亚洲国产岛国毛片在线| 成人免费观看毛片| 国产精品sss在线观看av| 日韩在线播放av| 中文字幕一区二区人妻视频| 99久久精品免费精品国产| 国产福利片一区二区| 91av一区| 国产亚洲精品一区二区| 五月天激情国产综合婷婷婷| 北条麻妃一区二区三区| 强伦女教师2:伦理在线观看| 欧美男女视频| 中文综合在线观看| 国产主播第一页| 久久久久久久免费视频了| 啊啊啊一区二区| 久久精品色综合| 久久久久久久亚洲精品| 国产99对白在线播放| 亚洲日本一区二区| 日本77777| 97精品视频| 91免费精品国偷自产在线| 日本在线观看www| 欧美精品一二三| 国产午夜精品理论片| 精品一区二区av| 法国空姐在线观看免费| 精品精品视频| 欧美极品在线播放| 五月婷婷伊人网| 天天影视网天天综合色在线播放| 午夜视频在线观看国产| 国产一区二区你懂的| 久久精品aaaaaa毛片| 国产精品粉嫩| 中文字幕日韩av电影| 亚洲中文字幕在线观看| 亚洲欧洲成人av每日更新| 中文字幕av一区二区三区人妻少妇| 亚洲蜜桃视频| 国产福利久久| 中文日产幕无线码一区二区| 亚洲人成网7777777国产| 一级久久久久久久| 亚洲狠狠丁香婷婷综合久久久| 欧美丰满熟妇bbb久久久| 国产一区二区精品| 亚洲人成影视在线观看| 免费看日产一区二区三区| 久久全国免费视频| 九一国产在线| 91精品婷婷国产综合久久 | 欧美日本网站| 欧美日韩一区二区在线观看| 国产又黄又爽又无遮挡| 91久色porny| 中文av字幕在线观看| 黄色成人91| 日韩在线电影一区| 久久精品一级| 日产精品99久久久久久| 国产精品刘玥久久一区| 亚洲国产天堂久久综合| 中文字幕黄色av| 亚洲国产综合色| 影音先锋制服丝袜| 国产·精品毛片| 99视频在线视频| 亚洲清纯自拍| 中国一区二区三区| 欧美毛片免费观看| 91久久精品美女高潮| 免费毛片b在线观看| 久久精品91久久香蕉加勒比| 五月婷婷伊人网| 日韩午夜在线观看视频| 亚洲色成人www永久网站| 亚洲影院在线观看| 国产又黄又粗视频| 不卡一区二区中文字幕| 在线观看国产中文字幕| 在线亚洲观看| 日本阿v视频在线观看| 欧美军人男男激情gay| 国产日韩欧美精品| 电影一区中文字幕| 国产精品极品在线| 日韩脚交footjobhd| 欧美日韩国产va另类| 91成人高清| 亚洲欧美中文另类| 色噜噜一区二区三区| 欧美午夜视频网站| 免费av网站在线| 亚洲欧美区自拍先锋| 一二三不卡视频| 成人福利视频网站| 免费观看黄网站| 国产精品自拍网站| 成人性生交免费看| 蜜臀久久久久久久| 狠狠热免费视频| 久久久久国产精品一区三寸| 精品视频免费在线播放| 欧美激情视频一区二区三区在线播放 | 久久最新资源网| 日本电影在线观看网站| 亚洲欧美在线看| 性xxxx视频| 亚洲精品国产拍免费91在线| 免费看黄色一级视频| 日韩精品专区在线| 国内毛片毛片毛片毛片| 欧美一区二区观看视频| 国产精品怡红院| 3d动漫精品啪啪| 国产又黄又大又爽| 911国产精品| 国产又粗又猛又爽又黄91| 欧美日产国产精品| 一级黄色a毛片| 777午夜精品视频在线播放| 国产一区二区视频免费观看| 337p亚洲精品色噜噜噜| 91片黄在线观看喷潮| 9191成人精品久久| 亚洲av无码一区二区三区dv| 亚洲第一天堂av| 午夜视频福利在线观看| 精品一区二区电影| 黄色av网站在线| 色偷偷888欧美精品久久久| 思思99re6国产在线播放| 久久久av一区| 欧美xxxxhdvideosex| 97香蕉久久夜色精品国产| 国产日韩电影| 国产又爽又黄的激情精品视频 | 亚洲永久视频| 五月婷婷激情久久| 国产揄拍国内精品对白| 蜜臀aⅴ国产精品久久久国产老师| 99热精品一区二区| 真实乱视频国产免费观看| 欧美国产视频在线| 欧美国产日韩在线观看成人 | 久久www视频| 亚洲巨乳在线| 亚洲精品高清无码视频| 国产综合色产在线精品| 这里只有精品在线观看视频| 亚洲国产成人私人影院tom| 日韩激情综合网| 亚洲成人av电影| 夜夜爽妓女8888视频免费观看| 777久久久精品| 日韩av免费观影| 久久亚洲精品一区| 日本在线影院| 91沈先生在线观看| 欧美丝袜美腿| 影音先锋欧美资源| 99国产精品私拍| 国产成人美女视频| 91视视频在线观看入口直接观看www | 自拍偷拍第八页| 亚洲成人久久一区| 3p在线观看| 538国产精品视频一区二区| 精品三级在线| 久久人人九九| 综合在线一区| 国产成人手机视频| 丁香一区二区三区| 国产一区二区三区视频播放| 黄网站色欧美视频| 99久久国产免费| 亚洲最新av在线网站| free性欧美16hd| 成人免费自拍视频| 国产日产一区| 久久综合色视频| 国产福利精品一区| 正在播放国产对白害羞| 狠狠色噜噜狠狠狠狠97| 精品国产av一区二区| 一区二区在线视频| 2020av在线| 国产精品国产三级欧美二区| 天天综合网91| 亚洲综合欧美在线| 久久精品夜夜夜夜久久| 香蕉免费毛片视频| 日韩精品一区二区三区三区免费| 午夜免费福利在线观看| 日本精品视频在线观看| 久久精品福利| 国产 日韩 欧美在线| 国产精品一级在线| 日本黄色录像视频| 欧美日韩在线播| aaa在线观看| 国产成人亚洲综合| 久久不见久久见免费视频7| 黄色一级视频片| 成人午夜视频在线观看| 1024手机在线视频| 7777精品久久久大香线蕉| 天堂аⅴ在线地址8| 国产精品久久精品| 日本一区二区高清不卡| av污在线观看| 国产精品国产成人国产三级 | 久99久视频| 亚洲尤物在线| 国产制服丝袜在线| 日韩欧美国产免费播放| 欧美一区二区视频| 国产成人精品久久二区二区| 国模吧精品视频| wwwwwxxxx日本| 亚洲色图20p| 韩国av电影在线观看| 久久久久久久久久久人体| 加勒比色老久久爱综合网| 日本a视频在线观看| 91视频.com| 国产真人无遮挡作爱免费视频| 伊人青青综合网站| 人人精品久久| 免费的av在线| 成人黄色国产精品网站大全在线免费观看 | 久久久综合免费视频| 女人抽搐喷水高潮国产精品| 99色精品视频| 国产精品毛片a∨一区二区三区| 国产精品久久久久久久免费| 九九热这里只有精品免费看| 国产精品tv| 午夜视频在线瓜伦| 日韩一区在线看| 国产小视频一区| 青草热久免费精品视频| 欧美顶级大胆免费视频| 性高潮久久久久久| 欧美性猛交xxxx黑人| 992tv免费直播在线观看| 成人片在线免费看| 羞羞答答国产精品www一本 | 夜夜揉揉日日人人青青一国产精品| 亚洲精品久久久蜜桃动漫| 欧洲成人免费视频| 999久久久国产精品| 亚洲av成人无码一二三在线观看| 在线免费观看成人短视频| a黄色片在线观看| 久久久久久久久四区三区| 麻豆精品国产传媒mv男同| 久久伊人成人网| 一区二区中文字幕| 日韩精品一区二区三区中文字幕| 国产最新免费视频| 亚洲色图制服丝袜| 四虎精品在永久在线观看| 91精品国产综合久久香蕉922| 亚洲国内自拍| 免费看一级黄色| 亚洲免费视频一区二区| 麻豆精品久久|