0x000 概述
反射
說起來和上一章節的代理
基本一樣,只是使用的方式不同,設計理念也不同。
反射
提供了一系列的靜態函數,可以使用Reflect.function_name(...prams)
調用,這一系列的方法和代理
的處理器對象
方法一致
0x001 apply
-
語法
Reflect.apply(target, thisArgument, argumentsList)
-
參數:
-
target
:目標 -
thisArgument
:調用的上下文 -
argumentList
:參數列表
-
-
-
栗子
function sayHelloTo(name, age){ console.log(`hello ${name}, i am ${this.name}, ${age} years old now`) } let obj={ name: 'jack' } Reflect.apply(sayHelloTo, obj, ['jack', 23]) // hello jack, i am jack, 23 years old now
0x002 construct
-
語法
Reflect.construct(target, argumentsList[, newTarget])
-
target
:目標 -
argumentsList
:參數列表 -
newTarget
:新的目標
-
-
栗子
function Person(name){ console.log(`Person ${name}`) } let obj={age:23} Reflect.construct(Person,['jack']) // Person jack
0x003 getOwnPropertyDescriptor
-
語法
Reflect.getOwnPropertyDescriptor(target, propKey)
-
target
:目標 -
propKey
:屬性值
-
-
栗子
let obj={name:'jack'} Reflect.getOwnPropertyDescriptor(obj, 'name') // {value: "jack", writable: true, enumerable: true, configurable: true}
0x004 defineProperty
-
語法
Reflect.defineProperty(target, propertyKey, attributes)
-
target
:目標 -
propertyKey
:屬性名 -
attributes
:屬性描述
-
-
栗子
let obj={} Reflect.defineProperty(obj,'name',{value:'jack'}) console.log(obj) // {name:'jack'}
0x005 deleteProperty
-
語法
Reflect.deleteProperty(target, propertyKey)
-
target
:目標 -
propertyKey
:屬性名
-
-
栗子
let obj={name:'jack'} Reflect.deleteProperty(obj, 'name') // true
0x006 ownKeys
-
語法
Reflect.ownKeys(target)
-
target
:目標
-
-
栗子
Reflect.ownKeys({name:'jack'}) // ["name"]
0x007 has
-
語法
Reflect.has(target, propertyKey)
-
target
:目標 -
propertyKey
:屬性名
-
-
栗子
Reflect.has({name:'jack'},'name') // true Reflect.has({name:'jack'},'age') // false
0x008 get
-
語法
Reflect.get(target, propertyKey[, receiver])
-
target
:目標 -
propertyKey
:屬性名 -
receiver
:接收者
-
-
栗子
let obj={name:'jack'} Reflect.get(obj, 'name') // "jack"
0x009 preventExtensions
-
語法
Reflect.preventExtensions(target)
-
target
:目標
-
-
栗子
Reflect.ownKeys({name:'jack',age:'23'}) // (2) ["name", "age"]
0x009 isExtensible
-
語法
Reflect.isExtensible(target)
-
target
:目標
-
-
栗子
Reflect.isExtensible({}) // true Reflect.isExtensible(Object.seal({})) // false Reflect.isExtensible(Object.freeze({})) // false let obj=Reflect.preventExtensions({}) Reflect.isExtensible(obj) // false
0x011 preventExtensions
-
語法
Reflect.preventExtensions(target)
-
target
:目標
-
-
栗子
Reflect.ownKeys({name:'jack',age:'23'}) // (2) ["name", "age"]
0x012 setPrototypeOf
-
語法
Reflect.setPrototypeOf(target, prototype)
-
target
:目標 -
prototype
:要設置的 prototype
-
-
栗子
Reflect.setPrototypeOf(obj, Array) Reflect.getPrototypeOf(obj) // ƒ Array() { [native code] }
0x013 getPrototypeOf
-
語法
Reflect.getPrototypeOf(target)
-
target
:目標
-
-
栗子
Reflect.getPrototypeOf([]) // [constructor: ƒ, concat: ƒ, copyWithin: ƒ, fill: ƒ, find: ƒ, …]