03月12, 2018

JavaScript 中的反射 Reflect

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

Reflect.apply()

对一个函数进行调用操作,同时可以传入一个数组作为调用参数。和 Function.prototype.apply() 功能类似。

let obj = {
    name: "张三",
    age: 18

}

const sayHello = function () {
    console.log(`Hello ${this.name}`)
}
//Reflect.apply()的三个参数都不能为空。
Reflect.apply(sayHello,obj,[])//Hello 张三

Reflect.construct()

对构造函数进行 new 操作,相当于执行 new target(...args)

class Point {
    constructor(x, y) {
        this.x = x
        this.y = y
    }
}

let point = Reflect.construct(Point,[10,20]);
console.log(point)//Point { x: 10, y: 20 }

Reflect.getOwnPropertyDescriptor()

获取目标对象某个属性的描述,参考 Object.defineProperty()

Reflect.defineProperty()和Reflect.deleteProperty()

设置和删除对象属性

let obj = {
    name: "张三",
    age: 18
}

Reflect.defineProperty(obj,"otherName",{
    value: "zhangsan",
    enumerable: true,
    writable: true
})

console.log(obj.otherName)//zhangsan
Reflect.deleteProperty(obj,"name")
console.log(obj.name)//undefined

console.log(Reflect.getOwnPropertyDescriptor(obj,"otherName"))
/**
 { value: 'zhangsan',
  writable: true,
  enumerable: true,
  configurable: false }
 */

Reflect.enumerate()

该方法会返回一个包含有目标对象身上所有可枚举的自身字符串属性以及继承字符串属性的迭代器,for...in 操作遍历到的正是这些属性。getOwnPropertyDescriptor()对象中enumerable属性为true是课遍历 实测 nodejs.v9.6.1 中已废除

let obj = {
    name: "张三",
    age: 18
}

Reflect.defineProperty(obj,"otherName",{
    value: "zhangsan",
    enumerable: true,
    writable: true
})

Reflect.defineProperty(obj,"otherAge",{
    value: 81,
    enumerable: false,
    writable: true
})

console.log(Reflect.enumerate(obj))

Reflect.get()和 Reflect.set()

设置和获取对象的属性

let obj = {
    name: "张三",
    age: 18
}

Reflect.set(obj,"name","zhangsan");
let newVar = Reflect.get(obj,"name");
console.log(newVar)//zhangsan

Reflect.getPrototypeOf()和Reflect.setPrototypeOf()

获取和设置对象的原型,改变对象的原型链

let obj = {
    name: "张三",
    age: 18
}

console.log(Reflect.getPrototypeOf(obj))//{}
Reflect.setPrototypeOf(obj,function () {

});
let prototypeOf = Reflect.getPrototypeOf(obj);
console.log(prototypeOf)//[Function]

Reflect.isExtensible()和Reflect.preventExtensions()

对象的扩展

let obj = {
    name: "张三",
    age: 18
}

console.log(Reflect.isExtensible(obj))//true
Reflect.preventExtensions(obj)
console.log(Reflect.isExtensible(obj))//false

Reflect.ownKeys()

返回一个包含所有自身属性(不包含继承属性)的数组

let obj = {
    name: "张三",
    age: 18
}

console.log(Reflect.ownKeys(obj))//[ 'name', 'age' ]

Reflect.has()

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

let obj = {
    name: "张三",
    age: 18
}

console.log(Reflect.has(obj,"name"))//true
console.log(Reflect.has(obj,"otherName"))//false

本文链接:https://www.qiangshuidiyu.xin/post/js-reflect.html

-- EOF --

Comments