Bootstrap

Reflect的十三个语法学习

 Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与

proxy handlers (en-US)的方法相同。Reflect不是一个函数对象,因此它是不可构造的。

默认调用功能
Reflect.get(target, key, receiver)对象属性的读取
Reflect.set(target, key, value, receiver)对象属性的设置
Reflect.deleteProperty(target, key)删除对象上的属性
Reflect.ownKeys(target)返回由目标对象自身的属性键组成的数组
Reflect.getOwnPropertyDescriptor(target, key)获取给定属性的属性描述符
Reflect.defineProperty(target, propKey, propDesc)定义或修改一个对象的属性
Reflect.preventExtensions(target)阻止新属性添加到对象
Reflect.getPrototypeOf(target)获取指定对象原型的函数
Reflect.isExtensible(target)判断一个对象是否可扩展
Reflect.setPrototypeOf(target, proto)设置或改变对象原型的函数
Reflect.apply(target, object, args)对一个函数进行操作,同事可以传入一个数组作为调用参数
Reflect.construct(target, args)对构造函数进行new操作,实现创建类的实例

Reflect语法之一:Reflect.has(target, propertyKey)

说明:判断一个对象是否存在某个属性,和 in 运算符的功能完全相同。

//语法: Reflect.has(target, propertyKey):判断一个对象是否存在某个属性,
  和 in 运算符的功能完全相同。  
const sum = {
   name:"张三",
   age:18
} 
console.log(Reflect.has(sum,"age"))   //true
console.log(Reflect.has(sum,"hobby")) //false

Reflect语法之二:Reflect.deleteProperty(object, 'property')

语法:静态 Reflect.deleteProperty() 方法允许删除属性。它就像 作为函数 的delete运算符。  

//语法:静态 Reflect.deleteProperty() 方法允许删除属性。
  它就像 作为函数 的delete运算符。  
  const object1 = {
     property1: 42,
     property2: 43,
   };

   Reflect.deleteProperty(object1, 'property1');
   // 返回值:Boolean 值表明该属性是否被成功删除。
   console.log(object1);  //{property2: 43}

Reflect语法之三:Reflect.isExtensible()

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

有一些不同。

Reflect语法之四: Reflect.preventExtensions(object1)

 静态方法 Reflect.preventExtensions(object1)返回一个 Boolean 值表明目标对象是否成功被设置

为不可扩展。

    /*
    静态方法 Reflect.isExtensible() 判断一个对象是否可扩展(即是否能够添加新的属性)。
    与它 Object.isExtensible() 方法相似,但有一些不同。
    */
    const object1 = {};
    console.log(Reflect.isExtensible(object1));//true(返回值为true说明可扩展)

    
    /*
    静态方法 Reflect.preventExtensions(object1)返回一个 Boolean 值表明目标对象是
    否成功被设置为不可扩展。
    */
    Reflect.preventExtensions(object1);
    console.log(Reflect.isExtensible(object1));//打印false,表明对象现在不可扩展

Reflect语法之五:

Reflect.defineProperty(target,propertyKey,attributes)

/*
静态方法 Reflect.defineProperty() 基本等同于 Object.defineProperty() 方法,
唯一不同是返回 Boolean 值。
语法:Reflect.defineProperty(target, propertyKey, attributes)
target:目标对象
propertyKey:要定义或修改的属性的名称
attributes:要定义或修改的属性的描述。
返回值:Boolean 值指示了属性是否被成功定义。如果target不是 Object,抛出一个 TypeError。
*/ 
let obj = {}
const a = Reflect.defineProperty(obj,'x',{
   // get(){
   //     return 7
   // }
   value:7
})
console.log(a)  //true

Reflect语法之六:

Reflect.getOwnPropertyDescriptor(target, propertyKey)

静态方法 Reflect.getOwnPropertyDescriptor() 与 Object.getOwnPropertyDescriptor() 方法相似。

如果在对象中存在,则返回给定的属性的属性描述符。否则返回 undefined。

/*
静态方法 Reflect.getOwnPropertyDescriptor() 与 Object.getOwnPropertyDescriptor() 方法相似。如果在对象中存在,则返回给定的属性的属性描述符。否则返回 undefined。
语法:Reflect.getOwnPropertyDescriptor(target, propertyKey)
参数:
target 需要寻找属性的目标对象。
propertyKey 获取自己的属性描述符的属性的名称。
*/ 
let obj1 = {foo:123}
const sum = Reflect.getOwnPropertyDescriptor(obj1, 'foo')
console.log(sum) //{value: 123, writable: true, enumerable: true, configurable: true}

Reflect语法之七:Reflect.getPrototypeOf()

静态方法 Reflect.getPrototypeOf() 与 Object.getPrototypeOf() 方法几乎是一样的。

都是返回指定对象的原型(即内部的 [[Prototype]] 属性的值)。

/*
静态方法 Reflect.getPrototypeOf() 与 Object.getPrototypeOf() 方法几乎是一样的。
都是返回指定对象的原型(即内部的 [[Prototype]] 属性的值)。
*/ 
const object2 = { property1: 42 };
const proto1 = Reflect.getPrototypeOf(object2);
console.log(proto1); //打印object的原型
const proto12 = Reflect.getPrototypeOf(proto1);
console.log(proto12) //null

Reflect语法之八:Reflect.ownKeys()

静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。

/*
Reflect.ownKeys()
静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。
*/
//如果是一个对象
let obj3 = {name:'张三',age:18,hobby:['打球','玩游戏']}
const a1 = Reflect.ownKeys(obj3)
console.log(a1)//name,age,hobby

Reflect语法之九:Reflect.get()

Reflect.get()方法与从 对象 (target[propertyKey]) 中读取属性类似,

但它是通过一个函数执行来操作的。

/*
Reflect.get()方法与从 对象 (target[propertyKey]) 中读取属性类似,
但它是通过一个函数执行来操作的。
*/
let obj4 = {x:1,y:2}
const a2 = Reflect.get(obj4,'x')
console.log(a2) //1

Reflect语法之十:Reflect.set()

静态方法 Reflect.set() 工作方式就像在一个对象上设置一个属性。

/*
静态方法 Reflect.set() 工作方式就像在一个对象上设置一个属性。
语法:
Reflect.set(target, propertyKey, value)
target:设置属性的目标对象。
propertyKey:设置的属性的名称。
value:添加属性的值
*/ 
let obj5 = {}
Reflect.set(obj5, "prop", "value");
;