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

es6 --- Reflect的静态方法相关推荐

  1. es6 Reflect对象的静态方法

    Reflect对象的静态方法 Reflect对象一共有 13 个静态方法. Reflect.apply(target, thisArg, args) Reflect.construct(target, ...

  2. es6 Reflect对象详解

    Reflect是ES6为操作对象而提供的新API,而这个API设计的目的只要有: 将Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect上能拿到语言内部的方法.如:Obj ...

  3. ES6 入门—ES6 Reflect 与 Proxy

    文章目录 前言 一.Proxy 二.Proxy 常用的拦截方法 2.1. get 方法 2.2. set 方法 2.3. has 方法 2.4. construct 方法 三.Reflect 四.ge ...

  4. es6 Class 的静态方法

    Class 的静态方法 类相当于实例的原型,所有在类中定义的方法,都会被实例继承.如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为"静态方 ...

  5. es6 Reflect对象简介

    Reflect对象简介 Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API.Reflect对象的设计目的有这样几个. (1) 将Object对象的一些明显属于语言内部 ...

  6. ES6 Reflect使用笔记

    Reflect Reflect 对象和Proxy对象一样, 为操作对象提供了新的API. 为什么使用 Reflect的方式来操作对象? 将 Object 对象上一些明显属于内部的方法放到 Reflec ...

  7. 学习笔记 JavaScript ES6 Promise的静态方法

    学习内容: Promise.resolve() Promise.reject() Promise.all() Promise.race() Promise.resolve(),表示成功的状态 Prom ...

  8. 【ES6(2015)】Reflect

    文章目录 1. 设计目的 2. 常用方法 Reflect对象与Proxy对象一样,也是ES6 为了操作对象而提供的新 API. 1. 设计目的 将Object属于语言内部的方法放到Reflect上 l ...

  9. ES6 Proxy和Reflect

    目录 Proxy 概述 基本用法 Proxy 实例方法 1.get(target, propKey, receiver) 2.set(target, propKey, value, receiver) ...

最新文章

  1. DataTable的Compute方法和Expression语法
  2. Docker容器的备份和还原
  3. Android怎么导入Moudle
  4. UVA719 Glass Beads 最小表示 / 后缀自动机
  5. java调用存储过程同时获取[返回参数]和[结果集]
  6. Leetcode Merge Sorted Array
  7. 学习笔记(01):ThreeJS视频教程-了解着色器基础
  8. 最新版24H全自动在线要饭系统全开源源码
  9. mysql数据库表中重命名语句_mysql数据库重命名sql语句
  10. google Chrome 浏览器升级更新了来源策略,导致不同域名来源页面信息【Referer】只有域名信息
  11. 《伯克毕生发展心理学2》
  12. 用友NC 用户名登录设置步骤
  13. linux设置display参数,Linux DISPLAY 变量设置
  14. flask怎么创建虚拟环境_在Windows OS中创建虚拟环境并在本地运行Flask应用程序
  15. 本地服务器上传文件,本地服务器上传文件
  16. 【Nand2tetris】Project02
  17. (必背)二叉树的前中后序遍历(利用栈)
  18. 一个深度为L的满k叉树的性质
  19. #FF00FF(255,0,255)应该是紫色(Purple),把#FF00FF称为“品红”(“洋红/Magenta”)是一种误称
  20. fzu2198 快来快来数一数

热门文章

  1. java实现三个数字的随机组合_JAVA编程实现随机生成指定长度的密码功能【大小写和数字组合】...
  2. php图片截取后缀,PHP抓取远程图片(含不带后缀的)教程详解
  3. mplab x ide 中文使用手册_SCI必备利器:翻译又快又准,强推这款超牛X的神器!...
  4. jieba 词典 词频_在Hanlp词典和jieba词典中手动添加未登录词
  5. java表达式1 2_Aviator 2.1.1 发布,Java表达式引擎
  6. 服务器运维一般的故障率,服务器平均故障率
  7. Swift中文件和图片上传处理
  8. C#调用存储过程的通用类
  9. 微信小程序image bindload事件失效不触发
  10. MySQL触发器 trigger学习