文章目录

  • 1. 设计目的
  • 2. 常用方法

Reflect对象与Proxy对象一样,也是ES6 为了操作对象而提供的新 API。

1. 设计目的

  • Object属于语言内部的方法放到Reflect
let obj = {}
let newVal = ''
Reflect.defineProperty(obj, 'name', {get() {return newVal},set(val) {newVal = val}
})
obj.name = 'xiaoming'
console.log(obj.name) // xiaoming
  • 修改某些Object方法的返回结果,让其变得更合理
// ES5 Object  报错
try {Object.defineProperty(target, property, attributes)// success
} catch (e) {// failure
}// ES6 Reflect  返回Boolean值
if (Reflect.defineProperty(target, property, attributes)) {// success
} else {// failure
}
  • 让Object操作变成函数行为
// ES5
'assign' in Object // true// ES6
Reflect.has(Object, 'assign') // true
  • Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。
Proxy(target, {set: function(target, name, value, receiver) {var success = Reflect.set(target, name, value, receiver)if (success) {console.log('property ' + name + ' on ' + target + ' set to ' + value)}return success}
})

与大多数全局对象不同,Reflect没有构造函数。你不能将其与一个new运算符一起使用,或者将Reflect对象作为一个函数来调用。Reflect的所有属性和方法都是静态的(就像Math对象)

2. 常用方法

Reflect.apply()

语法:Reflect.apply(target, thisArgument, argumentsList)

Reflect.apply(Math.floor, undefined, [1.75])
// 1Reflect.apply(String.fromCharCode, undefined, [104, 101, 108, 108, 111])
// "hello"Reflect.apply(RegExp.prototype.exec, /ab/, ['confabulation']).index
// 4Reflect.apply(''.charAt, 'ponies', [3])
// "i"

该方法与ES5中Function.prototype.apply()方法类似:调用一个方法并且显式地指定this变量和参数列表(arguments) ,参数列表可以是数组,或类似数组的对象。

// ES5
Function.prototype.apply.call(Math.floor, undefined, [1.75])

Reflect.construct()

语法:Reflect.construct(target, argumentsList[, newTarget])

Reflect.construct允许你使用可变的参数来调用构造函数

var obj = new Foo(...args)
var obj = Reflect.construct(Foo, args)var d = Reflect.construct(Date, [2021, 6, 4])
d instanceof Date // true
d.getFullYear() // 2021

如果使用 newTarget 参数,则表示继承了 newTarget 这个超类:

function someConstructor() {}
var result = Reflect.construct(Array, [], someConstructor)Reflect.getPrototypeOf(result) // someConstructor.prototype
Array.isArray(result) // true

Reflect.define​Property()

静态方法 Reflect.defineProperty() 基本等同于 Object.defineProperty() 方法,唯一不同是返回 Boolean 值。

语法:Reflect.defineProperty(target, propertyKey, attributes)

const people = {}
Reflect.defineProperty(people, 'name', {value: 'xiaoming'
}) // true
people.name // "xiaoming"

Reflect.delete​Property()

Reflect.deleteProperty 允许你删除一个对象上的属性。返回一个 Boolean 值表示该属性是否被成功删除。

语法:Reflect.deleteProperty(target, propertyKey)

var obj = {x: 1,y: 2
}
Reflect.deleteProperty(obj, "x") // true
obj // { y: 2 }var arr = [1, 2, 3, 4, 5]
Reflect.deleteProperty(arr, "3") // true
arr // [1, 2, 3, , 5]// 如果属性不存在,返回 true
Reflect.deleteProperty({}, "foo") // true// 如果属性不可设置,返回 false
Reflect.deleteProperty(Object.freeze({foo: 1
}), "foo") // false

Reflect.get()

Reflect.get()方法的工作方式,就像从 object 中获取属性target[propertyKey],但它是作为一个函数执行的。

语法: Reflect.get(target, propertyKey[, receiver])

// Object
var obj = {x: 1,y: 2
}
Reflect.get(obj, 'x') // 1// Array
Reflect.get(['zero', 'one'], 1) // "one"// Proxy with a get handler
var x = {p: 1
}
var obj = new Proxy(x, {get(t, k, r) {return k + 'bar'}
})
Reflect.get(obj, 'foo') // "foobar"

Reflect.set()
允许你在对象上设置属性。它的作用是给属性赋值并且就像 property accessor 语法一样,但是它是以函数的方式。
语法:Reflect.set(target, propertyKey, value[, receiver])

// Object
var obj = {}
Reflect.set(obj, "prop", "value") // true
obj.prop // "value"// Array
var arr = ["duck", "duck", "duck"]
Reflect.set(arr, 2, "goose") // true
arr[2] // "goose"// It can truncate an array.
Reflect.set(arr, "length", 1) // true
arr // ["duck"]// With just one argument, propertyKey and value are "undefined".
var obj = {}
Reflect.set(obj) // true
Reflect.getOwnPropertyDescriptor(obj, "undefined")
// { value: undefined, writable: true, enumerable: true, configurable: true }

Reflect.get​OwnProperty​Descriptor()
静态方法 Reflect.getOwnPropertyDescriptor()Object.getOwnPropertyDescriptor() 方法相似。如果在对象中存在,则返回给定的属性的属性描述符,否则返回undefinedReflect.getOwnPropertyDescriptor()的第一个参数不是一个对象(一个原始值),那么将造成 TypeError 错误;而对于Object.getOwnPropertyDescriptor,非对象的第一个参数将被强制转换为一个对象处理。

语法:Reflect.getOwnPropertyDescriptor(target, propertyKey)

Reflect.getOwnPropertyDescriptor({x: 'hello'
}, 'x')
// {value: "hello", writable: true, enumerable: true, configurable: true}Reflect.getOwnPropertyDescriptor({x: 'hello'
}, 'y')
// undefinedReflect.getOwnPropertyDescriptor([], 'length')
// {value: 0, writable: true, enumerable: false, configurable: false}

Reflect.get​PrototypeOf()
静态方法 Reflect.getPrototypeOf()Object.getPrototypeOf() 方法是一样的。都是返回指定对象的原型(即,内部的 [[Prototype]] 属性的值)。

语法:Reflect.getPrototypeOf(target)

Reflect.has()
检查一个对象是否拥有某个属性, 相当于in 操作符。

语法:Reflect.has(target, propertyKey)

Reflect.isExtensible()

判断一个对象是否可扩展 (即是否能够添加新的属性),它与 Object.isExtensible()方法一样。

Reflect.own​Keys()

返回一个由目标对象自身的属性键组成的数组。它的返回值等同于 Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))

语法:Reflect.ownKeys(target)

Reflect.prevent​Extensions()
阻止新属性添加到对象。

语法:Reflect.preventExtensions(target)

// Objects are extensible by default.
var empty = {}
Reflect.isExtensible(empty) // === true// ...but that can be changed.
Reflect.preventExtensions(empty)
Reflect.isExtensible(empty) // === false

Reflect.set​PrototypeOf()

改变指定对象的原型 (即,内部的 [[Prototype]] 属性值)。

语法:Reflect.setPrototypeOf(target, prototype)

Reflect.setPrototypeOf({}, Object.prototype) // true// It can change an object's [[Prototype]] to null.
Reflect.setPrototypeOf({}, null) // true// Returns false if target is not extensible.
Reflect.setPrototypeOf(Object.freeze({}), null) // false// Returns false if it cause a prototype chain cycle.
var target = {}
var proto = Object.create(target)
Reflect.setPrototypeOf(target, proto) // false

【ES6(2015)】Reflect相关推荐

  1. 【ES6(2015)】Module模块

    文章目录 1. 模块化的发展 2. export 3. as 4. export default 5. import 1. 模块化的发展 随着前端的发展,web技术日趋成熟,js功能越来越多,代码量也 ...

  2. 【ES6(2015)】Proxy

    文章目录 1. 基本语法 2. 拦截操作场景 3. 常用操作 在 ES6 标准中新增的一个非常强大的功能是 Proxy,它可以自定义一些常用行为如查找.赋值.枚举.函数调用等.通过 Proxy 这个名 ...

  3. 【ES6(2015)】Symbol

    文章目录 1. 声明方式 2. Symbol.for() 3. Symbol.keyFor() 4. 作为属性名 5. 属性遍历 6. 消除魔术字符串 ES6 引入了一种新的原始数据类型 Symbol ...

  4. 【ES6(2015)】Object对象

    文章目录 1. 属性简洁表示法 2. 属性名表达式 3. Object.is() 4. Object.assign() 5. in 6. 对象的遍历方式 1. 属性简洁表示法 ES5表示Object必 ...

  5. 【ES6(2015)】Iterator

    文章目录 1. 基本语法 2. Iterator 接口与 Generator 函数 MDN : 处理集合中的每个项是很常见的操作.JavaScript 提供了许多迭代集合的方法,从简单的for循环到m ...

  6. 【ES6(2015)】Number

    文章目录 1. 二进制与八进制 2. 新增方法 3. Math扩展 1. 二进制与八进制 ES5 中进制转换: const a = 5 console.log(a.toString(2)) // 转换 ...

  7. 【ES6(2015)】RegExp

    文章目录 1. y修饰符 2. u修饰符 1. y修饰符 ES6为正则表达式添加了y修饰符,叫做"粘连"(sticky)修饰符. y修饰符的作用与g修饰符类似,也是全局匹配,后一次 ...

  8. 【ES6(2015)】String

    文章目录 1. Unicode表示法 2. 遍历器接口 3. 模板字符串 4. 扩展方法 1. Unicode表示法 ES6 加强了对 Unicode 的支持,允许采用\uxxxx形式表示一个字符,其 ...

  9. 【ES6(2015)】Map

    文章目录 1. 基本语法 2. 遍历方式 3. WeekMap ES6 提供了 Map 数据结构.它类似于对象,也是键值对的集合,但是"键"的范围不限于字符串,各种类型的值(包括对 ...

最新文章

  1. 计算机组装高考真题,年计算机组装与维修高考题.pdf
  2. 手把手视频:万能开源Hawk抓取动态网站
  3. maven项目 ant_将旧项目从Ant迁移到Maven的4个简单步骤
  4. linux系统显卡驱动下载官网,NVIDIA显卡Linux系统驱动313.09版下载
  5. Storm实战常见问题及解决方案
  6. svn汉化失败解决方法
  7. 增值税怎么用计算机算,增值税计算器
  8. 西门子1200控制V90伺服,西门子1200通过PN通讯控制V90伺服,程序控制采用FB285功能块
  9. 蓝桥杯计算机软件大赛什么时间,“蓝桥杯”全国软件设计大赛
  10. C语言基础练习-输入球体半径,计算球体表面积和体积
  11. java 9宫格抽奖_js 实现9宫格抽奖(react)
  12. N-Tiers使用ObjectDataSouce如何自己处理中间层传回的错误讯息
  13. 电脑开机停在主板logo画面
  14. 看图吧地图数据如何玩转企业地信圈
  15. 一文彻底看懂LightGBM
  16. 如何提取论文中的表格数据(pdf转换excel)
  17. python 数据分析 |2. Jupyter Notebook配置和使用
  18. 教授专栏25 | 李家涛:从中国元素到全球管理理论—中国管理研究三十年[Part Ⅰ]...
  19. SpringBoot实现文件上传
  20. vscode找不到头文件的解决办法

热门文章

  1. Ubuntu 14.04 AM335x TI-RTOS 编译
  2. appcan slider轮播图和页面弹动冲突解决
  3. 转:模态对话框的支持 (IE,Firefox,Chrome)
  4. 中移动飞信2010Beta1.0体验版
  5. 大公司程序员 VS 小公司程序员 | 差别在哪?
  6. 论优秀的码农,学会这5点!
  7. Python在视频处理上的优势有哪些
  8. 飞鸽-http://www.freeeim.com/
  9. 我希望我一开始就知道的5个Python功能
  10. 30 个 Python 的最佳实践、小贴士和技巧,不可错过哟!