es6 --- Reflect的靜態方法

Reflect.get(target, name, receiver): 查找并返回 target對象的 name屬性,若沒有,返回undefined

var myObject = {foo: 1,bar: 2,get baz() {return this.foo + this.bar;},
}Reflect.get(myObject, 'foo');  // 1// 若name屬性部署了讀取函數(getter),則讀取函數的this 綁定receiver
var myObject = {foo: 1,bar: 2,get baz() {return this.foo + this.bar;},
};
var myReceiverObject = {foo: 4,bar: 4,
};
Reflect.get(myObject, 'baz', myReceiverObject); // 8// 注:第一個參數要為對象

Reflect.set(target, name, value, receiver): 設置target對象的name屬性等于value

var myObject = {foo: 1,set bar(value) {return this.foo = value;},
}myObject.foo // 1
Reflect.set(myObject, 'foo', 2);
myObject.foo // 2
Reflect.set(myObject, 'bar', 3);
myObject.foo // 3// 注:調用myObject對象的foo屬性是直接復制,調用bar方法,將3傳入,給foo賦值,// Reflect.set 會觸發Proxy.defineProperty攔截
let p = {a: 'a'
};
let handler = {set(target, key, value, receiver) {console.log('set');Reflect.set(target, key, value, receiver) },defineProperty(target, key, attribute) {console.log('defineProperty');Reflect.defineProperty(target, key, attribute);}
};
let obj = new Proxy(p, handler);
obj.a = 'A';
// 當執行obj.a = 'A‘的時候,會執行handler.set方法,
// handler.set方法里面的Reflect.set會觸發handler.defineProperty方法...

Reflect.has(obj, name): 對應name in obj 中的in 運算符

var myObject = {foo: 1,
};// 舊寫法
'foo' in myObject // true// 新寫法
Reflect.has(myObject, 'foo') // true

Reflect.deleteProperty(obj, name): 等同于delete obj[name], 用于刪除對象的屬性

const myObj = { foo: 'bar' };// 舊寫法
delete myObj.foo;// 新寫法
Reflect.delete(myObj, 'foo');

Reflect.construct(target, args): 等同于new target(…args)

function Greeting(name) {this.name = name;
}// new 的寫法
const instance = new Greeting('張三');// Reflect.construct 的寫法
const instance = Reflect.construct(Greeting, [' 張三']);
// 注意中括號,若沒有會報錯 Uncaught TypeError:CreateListFromArrayLike called on non-object

Reflect.getPrototypeOf(obj): 用于讀取對象的__proto__屬性,

const myObj = new FancyThing();// 舊寫法
Object.getPrototypeOf(myObj) === FancyThing.prototype;// 新寫法
Reflect.getPrototypeOf(myObj) === FancyThing.prototype;// 注: Object.getPrototypeOf 中,若參數不是對象,會先將參數轉換成對象,而Reflect會報錯

Reflect.setPrototypeOf(obj,newProto): 用于設置對象的__proto__屬性.

const myObj = new FancyThing();// 舊寫法
Object.setPrototypeOf(myObj, OtherThing.prototype);// 新寫法
Reflect.setPrototypeOf(myObj, OtherThing.prototype);// 如果第一個參數不是對象,Object.setPrototypeOf 會返回第一個參數本身.
// Reflect.setPrototypeOf 會報錯
// 如果第一個參數是 undefined 或null, Object 和 Reflect方法都會報錯.
console.log(Object.setPrototypeOf(1, {}));
console.log(Reflect.setPrototypeOf(1,{}));
console.log(Object.setPrototypeOf(null,{}));
console.log(Reflect.setPrototypeOf(null,{}));

在這里插入圖片描述
在這里插入圖片描述
Reflect.apply(func, thisArg, args): 等同于Function.prototype.apply.call(func, thisArg, args)

const ages = [11, 33, 12, 54, 18, 96];// 舊寫法
const youngest = Math.min.apply(Math, ages);
const oldest = Math.max.apply(Math, ages);
const type = Object.prototype.toString.call(youngest);// 新寫法
const youngest = Reflect.apply(Math.min, Math, ages);
const oldest = Reflect.apply(Math.max, Math, ages);
const type = Refelct.apply(Object.prototype.toString, youngest, []);

Reflect.defineProperty(target, propertyKey, attributes): 等同于Object.defineProperty

function MyData() {/*...*/
}// 舊寫法
Object.defineProperty(MyDate, 'now', {value: () => Date.now()
});// 新寫法
Reflect.defineProperty(MyDate, 'now', {value: () => Date.now()
});

Reflect.getOwnPropertyDescriptor: 等同于Object.getOwnPropertyDescriptor,用于獲取指定屬性的描述對象

var myObject = {};
Object.defineProperty(myObject, 'hidden', {value: true,enumerable: false,
});// 舊寫法(第一個參數非對象時,返回undefined)
var theDescriptor = Object.getOwnPropertyDescriptor(myObject, 'hidden');// 新寫法(第一個參數非對象時,報錯)
var theDescriptor = Reflect.getOwnPropertyDescriptor(myObject, 'hidden');

Reflect.isExtensible(target): 對應Object.isExtensible,表示對象是否可擴展

const myObject = {};// 舊寫法(若參數為非對象,會返回false)
Object.isExtensible(myObject);// 新寫法(若參數為非對象,會報錯)
Reflect.isExtensible(myObject);

Reflect.preventExtensions(target): 對應Object.preventExtensions方法,用于將一個對象變為不可擴展

var myObject = {];// 舊寫法
Object.preventExtensions(myObject);// 新寫法
Reflect.preventExtensions(myObject);// 若參入的參數是非對象
// ES5
Object.preventExtensions(1)  // 報錯
// ES6
Object.preventExtensions(1)  // 1
// ES6
Reflect.preventExtensions(1) // 報錯

Reflect.ownKeys(target): Object.getOwnPropertyNames 與 Object.getOwnPropertySymbols 之和

var myObject = {foo: 1,bar: 2,[symbol.for('baz')]: 3,[symbol.for('bing')]: 4,
};// 舊寫法
Object.getOwnPropertyNames(myObject)  // ['foo', 'bar']
Object.getOwnpropertySymbols(myObject) // [Symbol(baz), Symbol(bing)]// 新寫法
Reflect.ownKeys(myObject)   // ['foo', 'bar', Symbol(baz), Symbol(bing)]

參考《ES6標準入門》(第3版)P262~P270

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

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

相關文章

POJ3278——Catch That Cow

Catch That CowTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 114140 Accepted: 35715Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a nu…

canvas畫出簡陋版隨鼠標轉動眼睛且會眨眼的可愛櫻桃小丸子

可到我的github上下載文件 需求: 剛加載時鼠標不移動,眼睛會不停地眨眼眼球會跟隨鼠標移動而移動鼠標不移動時恢復眨眼效果提示: 除了眼睛是動態以外,其他靜態繪制都在static()函數中利用橢圓的短軸長度先變短后恢復長度來模擬…

poj 2049(二分+spfa判負環)

poj 2049(二分spfa判負環) 給你一堆字符串,若字符串x的后兩個字符和y的前兩個字符相連,那么x可向y連邊。問字符串環的平均最小值是多少。1 ≤ n ≤ 100000,有多組數據。 首先根據套路,二分是顯然的。然后跑…

Vue學習筆記(一)—— 什么時候需要import Vue from 'vue'

一、當執行 import vue from ‘vue’ 時發生了什么? 其實在 node.js 中,執行 import 就相當于執行了 require,而 require 被調用,就會用到 require.resolve 這個函數來查找包的路徑,而這個函數在 nodejs 中會有一個關于…

es6 --- 用promise對象實現Ajax操作的一個實例

首先回顧一下Ajax請求的步驟 var client new XMLHttpRequest(); client.open("GET", url); client.onreadystatechange handler; client.responseType "json"; client.setRequestHeader("Accept", "application/json"); client.s…

Windows 64 位 mysql 5.7以上版本包解壓中沒有data目錄和my-default.ini以及服務無法啟動的解決辦法以及修改初始密碼的方法...

LZ初學SQL,本來以為開源的安裝很簡單,但是中間出現了一些問題,記錄下來,希望能幫助到他人。 mysql官網下載地址:https://dev.mysql.com/downloads/mysql/點擊打開鏈接 以5.7.20版本為例 首先安裝包解壓后,沒…

總結 構造函數與非構造函數 原型繼承的一個方法

這兩天真的一直在看原型以及繼承之間的千絲萬縷,哇,收獲頗多,不過所謂溫故知新,還是要多復習復習知識點,才能察覺那些之前不易發現的小小sparkle 真心推薦MDN文檔——對象原型,JavaScript 中的繼承&#x…

【深度學習】caffe 中的一些參數介紹

一個優秀的算法工程師51%的時間在調參數,48%的時間在測試模型,剩下的1%時間再寫代碼。段子雖然是網上看來的,但調參數是真的心碎。像我這樣的小萌新更是覺得無從下手。只有知己知彼(了解每個參數的含義),才…

Vue學習筆記(二)—— vue項目中使用axios

一、文檔鏈接 axios文檔 vue開發插件 二、axios 簡介 axios 是一個基于Promise 用于瀏覽器和 nodejs 的 HTTP 客戶端,它本身具有以下特征: 從瀏覽器中創建 XMLHttpRequest 從 node.js 發出 http 請求 支持 Promise API 攔截請求和響應 轉換請求和響應…

es6 --- promise.prototype.then的鏈式引用

很多時候,我們需要使用ajax請求獲取數據A.并使用A中的數據A.a來進行下一步的Ajax操作… 下面使用promise.prototype.then的鏈式引用來實現 // 首先封裝一個getJSON的方法. var getJSON function (url) {var promise new Promise(function (resolve, reject) {var client ne…

jquery對json 鍵值對或數組的增加、刪除、遍歷操作

在前端遍歷json鍵值對或數組遍歷的情況也會經常用到,我們知道在java、c#其它的語言里提供方便的方法來操作,那么在json里面有沒有類似的方法呢,廢話就不多說了上代碼:var jsonStr{}; //增加 jsonStr["name1"]"yu&q…

廖雪峰老師Git教程代碼梳理

建立版本庫 創建一個版本庫非常簡單,首先,選擇一個合適的地方,創建一個空目錄(repository): $ mkdir learngit //創建learngit目錄 $ cd learngit //切換當前目錄為learngit目錄 $ pwd //用于顯示當…

BZOJ2006 [NOI2010]超級鋼琴 【堆 + RMQ】

2006: [NOI2010]超級鋼琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 3446 Solved: 1692[Submit][Status][Discuss]Description 小Z是一個小有名氣的鋼琴家,最近C博士送給了小Z一架超級鋼琴,小Z希望能夠用這架鋼琴創作出世界上最美妙的音樂。 這…

Vue項目代碼改進(六)—— vue的mixins的使用

混入可以將不同組件的共同內容部分在一個混入對象中展示,然后通過在組件實例中混入這個對象,這樣擁有這些屬性的組件都可以調用 混入對象中的屬性名跟組件中的屬性名沖突時,以組件自身的為基準 舉例:單文件組件users.vue 1&#x…

es6 --- Promise.catch

Promise.prototype.catch(): 是.then(null, rejection)的別名,用于指定發生錯誤時的回調函數 p.then( (val) -> console.log(fulfilled:, val)).catch( (err) > console.log(rejected, err));// 等同于 p.then( (val) > console.log(fulfilled:, val)).then(null, (e…

爬蟲的一些工具(二)

爬蟲的一些工具(二) 1. 常有的工具 (1). python(2). pycharm(3).瀏覽器i.chromeii.火狐(4).fiddler的使用2 fiddler的使用 (1).操作界面(2)界面含義請求(Request)部分詳解名稱含義Headers顯示客戶端發送到服務器的 HTTP 請求的,header 顯示為一個分級視圖,包含了 We…

微信開發者工具一打開代碼編輯區文件全部不見了

今天開微信開發者工具時,一打開竟然文件全部不見了!然后頁面也編譯不出來,搜了一下大神們的建議: 1、在編輯器控制臺輸入:openVendor 回車 會打開一個文件夾:C:\Users\Administrator\AppData\Local\微信we…

vue項目中所使用的element-UI / echarts

高清版思維導圖見后臺管理項目地址 1.login登錄頁面 < el-form >表單 在 Form 組件中&#xff0c;每一個表單域由一個 Form-Item 組件構成&#xff0c;表單域中可以放置各種類型的表單控件&#xff0c;包括 Input、Select、Checkbox、Radio、Switch、DatePicker、TimeP…

es6 --- 使用yield*命令遍歷完全二叉樹

首先定義二叉樹的結構: // 定義二叉樹的結構 function Tree(left, label, right) {this.left left;this.label label;this.right right; }// 對二叉樹采用中序遍歷 function* inorder(t) {if(t) {yield* inorder(t.left);yield t.label;yield* inorder(t.right);} }// 生成…

面向對象之繼承與派生

閱讀目錄 一 初識繼承二 繼承與抽象&#xff08;先抽象再繼承&#xff09;三 繼承與重用性四 派生五 組合與重用性六 接口與歸一化設計七 抽象類八 繼承實現的原理&#xff08;可惡的菱形問題&#xff09;九 子類中調用父類的方法一 初識繼承 什么是繼承 繼承是一種創建新類的方…