资讯专栏INFORMATION COLUMN

es6基础0x021:反射

booster / 2290人阅读

摘要:概述反射说起来和上一章节的代理基本一样,只是使用的方式不同,设计理念也不同。

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: ƒ, …]

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108674.html

相关文章

  • 《深入理解ES6》笔记——代理(Proxy)和反射(Reflection)API(12)

    摘要:方法与代理处理程序的方法相同。使用给目标函数传入指定的参数。当然,不用反射也可以读取的值。的例子我们可以理解成是拦截了方法,然后传入参数,将返回值赋值给,这样我们就能在需要读取这个返回值的时候调用。这种代理模式和的代理有异曲同工之妙。 反射 Reflect 当你见到一个新的API,不明白的时候,就在浏览器打印出来看看它的样子。 showImg(https://segmentfault....

    ZHAO_ 评论0 收藏0
  • 《深入理解ES6》笔记——代理(Proxy)和反射(Reflection)API(12)

    摘要:方法与代理处理程序的方法相同。使用给目标函数传入指定的参数。当然,不用反射也可以读取的值。的例子我们可以理解成是拦截了方法,然后传入参数,将返回值赋值给,这样我们就能在需要读取这个返回值的时候调用。这种代理模式和的代理有异曲同工之妙。 反射 Reflect 当你见到一个新的API,不明白的时候,就在浏览器打印出来看看它的样子。 showImg(https://segmentfault....

    shiina 评论0 收藏0
  • ES6中的代理(Proxy)和反射(Reflection)

    摘要:代理和反射的定义调用可常见代替其它目标对象的代理,它虚拟化了目标,所以二者看起来功能一致。代理可拦截引擎内部目标的底层对象操作,这些底层操作被拦截后会触发响应特定操作的陷阱函数。 代理和反射的定义 调用 new Proxy() 可常见代替其它目标 (target) 对象的代理,它虚拟化了目标,所以二者看起来功能一致。 代理可拦截JS引擎内部目标的底层对象操作,这些底层操作被拦截后会触发...

    Markxu 评论0 收藏0
  • 深入理解ES6笔记(十一)代理(Proxy)和反射(Reflection)API(12)

    摘要:是陷阱函数对应的反射方法,同时也是操作的默认行为。对象外形指的是对象已有的属性与方法的集合,由于该属性验证只须在读取属性时被触发,因此只要使用陷阱函数。无论该属性是对象自身的属性还是其原型的属性。 主要知识点:代理和反射的定义、常用的陷阱函数、可被撤销的代理、将代理对象作为原型使用、将代理作为类的原型showImg(https://segmentfault.com/img/bVbfWr...

    explorer_ddf 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<