探秘隱藏在對象中的get和set方法

来源:https://www.cnblogs.com/coderhf/archive/2020/07/02/13224470.html
-Advertisement-
Play Games

不知道大家有沒有註意過對象中的一些通用方法,例如所有所有的對象都有 toString、constructor 等等一些方法。 當然如果要仔細看的話,大家可以: var a = {}; console.log(a); 我們可以清晰的看到他有很多的內置方法。當然,也可以看到最下麵有兩個比較怪的方法 ge ...


不知道大家有沒有註意過對象中的一些通用方法,例如所有所有的對象都有 toString、constructor 等等一些方法。

 

當然如果要仔細看的話,大家可以:

 

 var a = {};
    console.log(a);

 

 

img

 

我們可以清晰的看到他有很多的內置方法。當然,也可以看到最下麵有兩個比較怪的方法 get 和 set ,只要是對象就可以找到這兩個方法,但是究竟怎麼使用這兩個方法呢?

 

我自己研究了半天,發現可以這樣使用,就拿最簡單的對象 json 來舉例。

 

 
 var Json = {
        set Leo(value){
            console.log(value)
        }
     };
    Json.Leo = 'liyou' //'liyou' 

 

 

 

 

使用起來你會發現非常的怪異, 這個東西看起來像個函數,但是又必需賦值才能用。我們理解起來大概就是,只要一賦值,這個屬性就被從新賦予新的東西,而「這個」則是執行了這個函數。

 

那麼,到底他是不是函數呢?我們來繼續探索一下這個 set 。

 
 
  typeof Json.Leo //undefined 
    Json.Leo() //Error:Json.Leo is not a function 

 

 

 

 

也就是說,「這個」東西不是作為他的私有屬性存在,而「這個」也不是函數。

 

繼續實驗的話,會發現「這個」東西只可以傳一個參數。

 

 var Json = {
 ​
 •       set Leo(value,nextValue){ //Uncaught SyntaxError: Setter must have exactly one formal parameter.

 

 

 

 

 

代碼提示一個只允許使用一個參數,也是說他只支持一個參數。當然,如果我們想傳很多的話,似乎也只能通過 json 。

 

 var Json = {
        set Leo(...val){ //Uncaught SyntaxError: Setter function argument must not be a rest parameter
            console.log(val)
        }
     };
    Json.Leo = 'liyou' 
 ​
 ​
 ​
 不支持 ES6 的不定數組參,但是支持 arguments 。
 ​
 ​
 ​
 var Json = {
        set Leo(val){
            console.log(arguments[0])
        }
     };
    Json.Leo = 'liyou' //'liyou';

 

 

 

而 get 方法和他很接近,使用起來就像一個私有的屬性用起來一樣。

 

例如:

 
 var Json = {
        set Leo(val){
            console.log(arguments[0])
        },
        get Leo(){
            console.log('liyou')
        } 
     };
    Json.Leo //'liyou';

 

 

 

 

當然我們可以看出來,如果賦值就會走 set ,如果沒有賦值就會走 get 。

 

值得一提的是, get 方法是不允許有參數的,一旦裡面放入一個參數,就會直接報錯。

 

雖然可以順利使 get 方法,但是如果我們想要找到「這個」東西到底,結果是我們依然找不到他。

 

 Json.Leo //'liyou'
typeof Json.Leo // undefined

 

 

 

簡而言之,一個內置的函數體可以使用,但是不能當作正常的一個私有屬性來判斷其數據類型。

 

那麼,如果這個函數體碰上了真正的私有屬性會變稱什麼樣呢?

 

例如:

 

 var Json = {
 ​
 •      get Leo(){
 •         return 10;
 •      },
 •     Leo:20
 ​
    };
    console.log(Json.Leo)? 

 

 

 

答案是 undefined 。其實也不難怪,因為似乎 js 也不知道你拿的是內置函數體還是私有屬性,而且似乎本來性質也不一樣,所以到頭來也只能給你一個 undefined 。

 

當然這裡面的 this 還是指向對象本身的。

 

例如:

 
 
 var Json = {
 ​
 •      get Leo(){
 •        return this
 •      }
 ​
    };
    
    Json.b = Json.Leo//

 

 

 

 

這個時候 json 下麵就有無窮無盡的 b ,就像 window 下麵有無窮的 window 一樣。

 

值得一提的是,「這個」東西只能手動的在寫對象的時候寫到裡面,而不能通過賦值去給予。

 

例如:

 

  var a = {};
    a['set Leo'] = function(){}//

 

 

 

這裡面的 set 和上文的 set 不是一個東西。

 

當然 json 中的 get/set 也可以迴圈使用。

 

例如:

 
 
 var Json = {
 ​
 get Leo(){
 ​
 return {
 ​
 get isTeacher(){
 ​
 console.log('liyou')
 ​
 }
 ​
 }
 ​
 }
 ​
 ​
 ​
 }
 ​
 ​
 ​
 Json.Leo.isTeacher //'liyou'

 

 

 

 

「這個」東西不能在一般的函數中使用。

 

比如,function show(){set Leo(){}} // 報錯。雖然 new show() 裡面有這個內置函數,但是還是不能使用。

 

但是卻可以在 ES6 中的 class 對象中使用。

 

例如:

 class Leo {
 ​
  constructor() {
 ​
  }
 ​
  get show() {
 ​
   return 'liyou';
 ​
  }
 ​
  set show(value) {
 ​
   console.log('liyou: '+value);
 ​
  }
 ​
 }
 ​
 let inst = new Leo();
 ​
 inst.show = 123;
 ​
 // liyou: 123
 ​
 inst.show
 ​
 // 'liyou'

 

因為class 類本身也屬於函數對象,所以函數對象中有這個 get/set 內置函數,就不奇怪了。

總結

對了,小編為大家準備了一套2020最新的web前端資料,需要點擊下方鏈接獲取方式

學習前端,你掌握這些。二線也能輕鬆拿8K以上

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Koch曲線的構造過程是:取一條長度為L0的直線段,將其三等分,保留兩端的線段,將中間的一段改換成夾角為60度的兩個等長直線;再將長度為L0/3的4個直線段分別進行三等分,並將它們中間的一段均改換成夾角為60度的兩段長為L0/9的直線段;重覆以上操作直至無窮,可得以一條具有自相似結構的折線,如圖1所 ...
  • 1 問題 當使用pdfjs來實現預覽功能的時候,遇到了2個問題: 一是帶寬占用過大,會下載整個pdf文件,這對部署在公網的應用來說,成本壓力很大,因為雲服務帶寬是很貴的。 二是記憶體占用過大,一個80M的pdf,在預覽時占用記憶體高達600M,在一些記憶體較小的手機上容易發生崩潰。 pdfjs預設配置下, ...
  • 1.圖片標簽 img src:圖片路徑 width:設置圖片的寬度,如果是單獨設置,則保存圖片比例進行修改,單位可以是px和% height:設置圖片的高度,如果是單獨設置,則保存圖片比例進行修改,單位可以是px和% title:滑鼠放在圖片上提示圖片名稱 alt:當圖片路徑有誤的時候用來提示 路徑 ...
  • 關於HTML中的 <!DOCTYPE> 聲明 今天在完成課程任務時,我的HTML代碼中一處出現了一個問題。 我現在有三張圖片,這三張圖片是從一張圖片無縫裁剪下來的,這三張圖片均等寬不等高,若使用PS可完美拼接回原圖。我在表格內,將此三張圖片放入,當瀏覽器運行時,我發現此三圖片並未完美緊密貼合,而是兩 ...
  • 元編程是一種強大的技術,使你能夠編寫可以創建其他程式的程式。ES6藉助代理和許多類似功能,使在JavaScript中利用元編程變得更加容易。ES6 Proxy(代理) 有助於重新定義對象的基本操作,從而為各種可能性打開了大門。 本指南可以幫助您理解為什麼ES6代理如此之好,尤其是對於元編程而言: 什 ...
  • 1.HTML的head標簽 head標簽中主要配置瀏覽器的配置信息 常用的配置信息: 1.網頁解析編碼格式 2.網頁標題標簽 3.網頁關鍵字 4.網頁描述 5.作者 6.自動跳轉 7.其他(引入css,js) 註:其中第三,第四和第五項,提升在瀏覽器中的搜索概率 例: 2.HTML的body標簽(文 ...
  • 憑藉應用廣泛、入門簡單的優勢,Web前端吸引了人們的廣泛關註。學習Web前端就業薪資高,因此很多人都想入門前端開發行業。 零基礎自學Web前端,你需要具備以下幾點: 1、耐性。要成為優秀的web前端開發者,要調整好心態。拋開一切的方法和技術知識,最重要的就是你的耐性。 2、學會延伸。對於新手來說,新 ...
  • 目錄判斷 js 類型的方式ES5 和 ES6 分別幾種方式聲明變數閉包的概念?優缺點?淺拷貝和深拷貝數組去重的方法DOM 事件有哪些階段?談談對事件代理的理解js 執行機制、事件迴圈介紹下 promise.allasync 和 awaitES6 的 class 和構造函數的區別transform、t ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...