ES6-16 WeakMap與WeakSet、proxy與reflect

WeakMap/WeakSet

在這里插入圖片描述

  • 原型上不存在遍歷方法(沒有部署iterator接口)
  • 成員只能是對象
  • 垃圾回收機制不考慮對成員對象的應用

WeakSet/WeakMap 中的對象都是弱引用,即垃圾回收機制不考慮 WeakSet 對該對象的引用,也就是說,如果其他對象都不再引用該對象,那么垃圾回收機制會自動回收該對象所占用的內存,不考慮該對象還存在于 WeakSet 之中。
這是因為垃圾回收機制根據對象的可達性(reachability)來判斷回收,如果對象還能被訪問到,垃圾回收機制就不會釋放這塊內存。結束使用該值之后,有時會忘記取消引用,導致內存無法釋放,進而可能會引發內存泄漏。WeakSet 里面的引用,都不計入垃圾回收機制,所以就不存在這個問題。因此,WeakSet 適合臨時存放一組對象,以及存放跟對象綁定的信息。只要這些對象在外部消失,它在 WeakSet 里面的引用就會自動消失。
由于上面這個特點,WeakSet 的成員是不適合引用的,因為它會隨時消失。另外,由于 WeakSet 內部有多少個成員,取決于垃圾回收機制有沒有運行,運行前后很可能成員個數是不一樣的,而垃圾回收機制何時運行是不可預測的,因此 ES6 規定 WeakSet 不可遍歷。

Proxy

Proxy 可以理解成,在目標對象之前架設一層“攔截”,外界對該對象的訪問,都必須先通過這層攔截,因此提供了一種機制,可以對外界的訪問進行過濾和改寫。Proxy 這個詞的原意是代理,用在這里表示由它來“代理”某些操作,可以譯為“代理器”。

var proxy = new Proxy(target, handler);

  • target參數表示所要攔截的目標對象,handler參數也是一個對象,用來定制攔截行為。
  • 如果handler沒有設置任何攔截,那就等同于直接通向原對象。
  • Proxy實例proxy來訪問target的屬性
  • 一個技巧是將 Proxy 對象,設置到object.proxy屬性,從而可以在object對象上調用。
var object = { proxy: new Proxy(target, handler) };
  • 雖然for…in循環也用到了in運算符,但是has()攔截對for…in循環不生效。
const star = {name: "Yoona Lim",age: 23,tel: 'star 666'
}
const agent = new Proxy(star, {get: function (target, key) {if (key === 'tel') {return 'rejected 110'} else {return target[key]}},set: function (target, key, val) {if (key === 'offerPrice') {if (val < 5000) {throw new ReferenceError('below standard!')} else {target[key] = val}} else {target[key] = val}},has: function (target, key) {console.log('走了has攔截')return target.hasOwnProperty(key)}
})
console.log(agent.name)
console.log(agent.age)
console.log(agent.tel)
agent.cute = true
console.log(agent.cute)
agent.offerPrice = 50000
console.log(agent.offerPrice)
console.log('offerPrice' in agent)
console.log('gender' in agent)
for (let key in agent) {console.log('for...in不走has攔截', agent[key])
}console.log(agent)console.log(star)
agent.offerPrice = 50

在這里插入圖片描述

Reflect

Reflect對象的設計目的有這樣幾個。
(1) 將Object對象的一些明顯屬于語言內部的方法(比如Object.defineProperty),放到Reflect對象上。現階段,某些方法同時在Object和Reflect對象上部署,未來的新方法將只部署在Reflect對象上。也就是說,從Reflect對象上可以拿到語言內部的方法。
(2) 修改某些Object方法的返回結果,讓其變得更合理。比如,Object.defineProperty(obj, name, desc)在無法定義屬性時,會拋出一個錯誤,而Reflect.defineProperty(obj, name, desc)則會返回false。
(3) 讓Object操作都變成函數行為。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)讓它們變成了函數行為

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250984.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250984.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jquery--- 屬性和樣式的操作 設置和獲取HTML、文本和值、焦點事件

1.獲取p元素的title屬性: var title $("p").attr("title");2.給p元素加title屬性(值為:栗子)和date屬性(值為:2019/7/15): $("p").attr("title":"栗子", "date":"2019/7/15");3.刪除p中的title屬性:…

day9

前方高能---初識函數 一. 什么是函數 函數:對代碼塊和功能的封裝和定義. 二. 函數的定義,函數名,函數體,以及函數的調用 def 函數名(): 函數體 函數體:就是函數被執行之后要執行的代碼. 三, 函數的返回 執行完函數之后,我們可以使用return來返回結果. 函數中return的使用: 1.函…

MySQL 數據庫索引

數據庫索引在數據庫中、索引使數據庫程序無須對整個表進行全表掃描就可以在其中找到所需的數據&#xff1b;數據庫中的索引是某個表中一列或者若干列值的集合、以及物理標識這些值的數據頁的邏輯指針清單&#xff1b;MySQL 索引的增刪查SQL 語句效率的分析索引的作用&#xff1…

ES6-17 class與對象

class 模擬類的方式語法糖&#xff08;把以前的寫法換了一個方式&#xff09; 類內部的方法是不可枚舉的 ES5用Object.assign拓展的原型屬性是可枚舉的 function Point(x, y) {this.x x;this.y y; } // 這樣定義的原型上方法eat\drink是可枚舉的 Point.prototype Object…

8.8 正睿暑期集訓營 Day5

目錄 2018.8.8 正睿暑期集訓營 Day5總結A 友誼巨輪(線段樹 動態開點)B 璀璨光滑C 構解巨樹考試代碼ABC2018.8.8 正睿暑期集訓營 Day5時間&#xff1a;3.5h(實際)期望得分&#xff1a;602020實際得分&#xff1a;202020 比賽鏈接這里也有一些 總結 線段樹&#xff01;&#xff0…

算法 --- 二叉樹的最大深度

思路: 1.二叉樹的深度,等于Max(左子樹最大深度,右子樹最大深度) 1 2.節點不存在時,此時的深度為0 3.當節點存在,左右子樹不存在時(此時為葉子節點) 返回1 /*** Definition for a binary tree node.* function TreeNode(val) {* this.val val;* this.left this.righ…

ES6-18/19 異步的開端-promise

ES6-18異步的開端-promise ES6-19 promise的使用方法和自定義promisify try catch只能捕獲同步異常&#xff0c;不能捕獲異步的 等待所有異步都執行完&#xff0c;打印結果&#xff0c;比較笨拙的方法&#xff0c;在每個異步操作加arr.length 3 && show(arr) Promis…

leetcode35 C++ 4ms 搜索插入位置

class Solution { public:int searchInsert(vector<int>& nums, int target) {for(int i 0;i<nums.size();i){if(nums[i] > target){return i;}}return nums.size()-1;} }; 轉載于:https://www.cnblogs.com/theodoric008/p/9449049.html

OpenCV-Python 中文教程(搬運)目錄

OpenCV-Python 中文教程 OpenCV官方教程中文版&#xff08;For Python&#xff09; OpenCV2-Python-Tutorials 段力輝 譯 說明&#xff1a;搬運自linux公社pdf文件&#xff0c;粗略搬運&#xff0c;僅作個人筆記參考&#xff0c;有時間再美化 部分文件參考&#xff1a; https:/…

算法 --- 平衡二叉樹

解題思路: 1.首先寫一個返回深度的函數d 2.寫一個遍歷函數t 3.在t中首先判斷,r是否為空(為空則此時就是平衡二叉樹,返回true),然后判斷是否為葉子節點(r.left null && r.right null)若是則返回true,最后判斷,其左子樹的深度與右子樹的深度之差是否大于1.若是則返回fal…

【co】ES6-20/21 iterator與generator

ES6-20 iterator與generator ES6-21 async與await、ES6的模塊化 try catch不能捕獲異步異常 try catch是同步代碼 try {setTimeout(() > {console.log(a)}) } catch (e) {console.log(e) }iterator 內部迭代器&#xff1a;系統定義好的迭代器接口&#xff08;如數組Symbol…

嵌入式系統UBOOT

一個完整的嵌入式linux系統包含4部分內容&#xff1a;Bootloader、Parameters、Kernel、Root File System。3、4、5、6部分詳細介紹了這4部分的內容&#xff0c;這是Linux底層軟件開發人員應該掌握的。通過學習這些章節&#xff0c;您可以詳細了解到如何在一個裸板上裁減、移植…

驅動芯片

一 LED驅動芯片&#xff1a; 1.1 TM1640:16位數碼管驅動芯片&#xff0c;2線制控制&#xff08;CLK/DIN&#xff09;,SCLK低電平時DIN輸入&#xff0c;而SCLK高電平時保持DIN保持不變&#xff1b;開始傳輸&#xff1a;SCLKH時DIN由高變低&#xff0c;停止傳輸SCLKH時DIN由由低變…

jquery --- 控制元素的隱藏/顯示

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> </head> <body> <div id"panel"><h5 class"head">什么是jquery?</h5><div class"content" style"display:non…

confusion_matrix(混淆矩陣)

作者&#xff1a;十歲的小男孩 凡心所向&#xff0c;素履可往 目錄 監督學習—混淆矩陣 是什么&#xff1f;有什么用&#xff1f;怎么用&#xff1f; 非監督學習—匹配矩陣 混淆矩陣 矩陣每一列代表預測值&#xff0c;每一行代表的是實際的類別。這個名字來源于它可以非常容…

Python 21 Django 實用小案例1

實用案例 驗證碼與驗證 KindEditor 組合搜索的實現 單例模式 beautifulsoup4 驗證碼與驗證 需要安裝Pillow模塊 pip stall pillow1、首先需要借助pillow模塊用來畫一個驗證碼圖形&#xff0c;這里單獨封裝了一個py文件&#xff0c;調用一個方法就好了 1 #!/user/bin/env python…

jquery --- 事件處理函數的event對象的幾個屬性(方法)說明

1.event.type: 事件的類型 $(a).click(function(event) {alert(event.type);return false; // 阻止鏈接跳轉 }); // click2.event.preventDefault(): 阻止默認事件 $("#sub").bind("click", function(event) {var username $("#username").va…

數據恢復軟件

鏈接&#xff1a;https://pan.baidu.com/s/1n6x5vhW-3SY8MAvvnqVtog 密碼&#xff1a;thh0轉載于:https://www.cnblogs.com/huanu/p/9452039.html

VMware

1.VMware軟件安裝&#xff1a; https://jingyan.baidu.com/article/9f7e7ec09da5906f281554d6.html 2&#xff0c;鏡像文件下載地址&#xff1a;http://www.cnbeta.com/articles/tech/566773.htm 有圖形界面。 或是在官網&#xff1a;https://wiki.centos.org/Download 2.cento…

jquery --- 全選、全不選、反選、提交

注意:jquery 提供的$(’#id’).attr(‘checked’,true)方法,在某些情況下會失效… 因此,使用js原生的 .checked true方法 控制 // html <form>你愛好的運動是? <br/><input type"checkbox" name"items" value"足球" /> 足球…