摘要:概述反射说起来和上一章节的代理基本一样,只是使用的方式不同,设计理念也不同。
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 now0x002 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 jack0x003 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") // true0x006 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") // false0x008 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) // false0x011 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: ƒ, …]
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/108674.html
摘要:方法与代理处理程序的方法相同。使用给目标函数传入指定的参数。当然,不用反射也可以读取的值。的例子我们可以理解成是拦截了方法,然后传入参数,将返回值赋值给,这样我们就能在需要读取这个返回值的时候调用。这种代理模式和的代理有异曲同工之妙。 反射 Reflect 当你见到一个新的API,不明白的时候,就在浏览器打印出来看看它的样子。 showImg(https://segmentfault....
摘要:方法与代理处理程序的方法相同。使用给目标函数传入指定的参数。当然,不用反射也可以读取的值。的例子我们可以理解成是拦截了方法,然后传入参数,将返回值赋值给,这样我们就能在需要读取这个返回值的时候调用。这种代理模式和的代理有异曲同工之妙。 反射 Reflect 当你见到一个新的API,不明白的时候,就在浏览器打印出来看看它的样子。 showImg(https://segmentfault....
摘要:代理和反射的定义调用可常见代替其它目标对象的代理,它虚拟化了目标,所以二者看起来功能一致。代理可拦截引擎内部目标的底层对象操作,这些底层操作被拦截后会触发响应特定操作的陷阱函数。 代理和反射的定义 调用 new Proxy() 可常见代替其它目标 (target) 对象的代理,它虚拟化了目标,所以二者看起来功能一致。 代理可拦截JS引擎内部目标的底层对象操作,这些底层操作被拦截后会触发...
摘要:是陷阱函数对应的反射方法,同时也是操作的默认行为。对象外形指的是对象已有的属性与方法的集合,由于该属性验证只须在读取属性时被触发,因此只要使用陷阱函数。无论该属性是对象自身的属性还是其原型的属性。 主要知识点:代理和反射的定义、常用的陷阱函数、可被撤销的代理、将代理对象作为原型使用、将代理作为类的原型showImg(https://segmentfault.com/img/bVbfWr...
阅读 1691·2021-09-26 09:55
阅读 3718·2021-09-22 15:31
阅读 7372·2021-09-22 15:12
阅读 2212·2021-09-22 10:02
阅读 4631·2021-09-04 16:40
阅读 1033·2019-08-30 15:55
阅读 3022·2019-08-30 12:56
阅读 1815·2019-08-30 12:44