JS 反射机制及 Reflect 详解 (2)

Reflect.deleteProperty 允许你删除一个对象上的属性,返回一个 Boolean 值表示该属性是否被成功删除,它几乎与非严格的 delete operator 相同
Reflect.deleteProperty(target, propertyKey)

target:删除属性的目标对象

propertyKey:将被删除的属性的名称

① ES5 用法 const obj = { x: 1, y: 2 } const a = delete obj.x obj // {y: 2} a // true ② ES6 用法 const obj = { x: 1, y: 2 } const a = Reflect.deleteProperty(obj, 'x') obj // {y: 2} a // true 7、.get()

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

① ES5 用法 const obj = { x: 1, y: 2 } obj.x // 1 obj['x'] // 1 ② ES6 用法 const obj = { x: 1, y: 2 } Reflect.get(obj, 'x') // 1 Reflect.get(['a', 'b', 'c'], 1) // b 8、.getOwnPropertyDescriptor()

静态方法 Reflect.getOwnPropertyDescriptor() 与 Object.getOwnPropertyDescriptor() 方法相似
如果在对象中存在,则返回给定的属性的属性描述符,否则返回 undefined
Reflect.getOwnPropertyDescriptor(target, propertyKey)

① ES5 用法 const obj = { x: 1, y: 2 } Object.getOwnPropertyDescriptor(obj, 'x') // {value: 1, writable: true, enumerable: true, configurable: true} ② ES6 用法 const obj = { x: 1, y: 2 } Reflect.getOwnPropertyDescriptor(obj, 'x') // {value: 1, writable: true, enumerable: true, configurable: true} Reflect.getOwnPropertyDescriptor({ x: 'hello' }, 'y') // undefined Reflect.getOwnPropertyDescriptor([], 'length') // {value: 0, writable: true, enumerable: false, configurable: false} ③ 对比

如果 Reflect.getOwnPropertyDescriptor 的第一个参数不是一个对象(一个原始值),那么将造成 TypeError 错误
而对于 Object.getOwnPropertyDescriptor,非对象的第一个参数将被强制转换为一个对象处理

Reflect.getOwnPropertyDescriptor("foo", 0); // TypeError: "foo" is not non-null object Object.getOwnPropertyDescriptor("foo", 0); // { value: "f", writable: false, enumerable: true, configurable: false } 9、.getPrototypeOf()

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

① ES5 用法 const d = New Date() Object.getPrototypeOf(d) // {constructor: ƒ, toString: ƒ, toDateString: ƒ, toTimeString: ƒ, toISOString: ƒ, …} ② ES6 用法 const d = New Date() Reflect.getPrototypeOf(d) // {constructor: ƒ, toString: ƒ, toDateString: ƒ, toTimeString: ƒ, toISOString: ƒ, …} 10、.has()

判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同
Reflect.has(target, propertyKey)

const obj = { x: 1, y: 2 } Reflect.has(obj, 'x') // true Reflect.has(obj, 'z') // false 11、.isExtensible()

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

const obj = { x: 1, y: 2 } Reflect.isExtensible(obj) // true Object.freeze(obj) // 阻止新属性添加到对象 obj.z = 3 Reflect.isExtensible(obj) // false obj // {x: 1, y: 2} 12、.ownKeys()

判断对象自身属性
Reflect.ownKeys 方法返回一个由目标对象自身的属性键组成的数组,它的返回值等同于 `Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))
Reflect.ownKeys(target)

const obj = { x: 1, y: 2 } Reflect.ownKeys(obj) // ["x", "y"] Reflect.ownKeys([]) // ["length"] Reflect.ownKeys([1, 2]) // ["0", "1", "length"] 13、.preventExtensions()

阻止新属性添加到对象,等同于Object.freeze()
Reflect.preventExtensions 方法阻止新属性添加到对象,例如:防止将来对对象的扩展被添加到对象中,与 Object.preventExtensions() 方法一致

Reflect.preventExtensions(target)

const obj = { x: 1, y: 2 } Reflect.isExtensible(obj) // true Reflect.preventExtensions(obj) // 阻止新属性添加到对象 obj.z = 3 Reflect.isExtensible(obj) // false obj // {x: 1, y: 2} 14、.set()

写数据
Reflect.set 方法允许你在对象上设置属性,用来给属性赋值,类似 property accessor 的语法,但它是以函数的方式
Reflect.set(target, propertyKey, value[, receiver])

const obj = { x: 1, y: 2 } Reflect.set(obj, 'z', 4) obj // {x: 1, y: 2, z: 4} const arr = ['apple', 'pear'] Reflect.set(arr, 1, 'banana') arr // ["apple", "banana"] 15、.setPrototypeOf()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwwfg.html