反射 Reflect
当你见到一个新的API,不明白的时刻,就在浏览器打印出来看看它的模样。
反射的观点
Reflect 是一个内置的对象,它供应可阻拦JavaScript操纵的要领。要领与代办处置惩罚顺序的要领雷同。Reflect 不是一个函数对象,因而它是不可组织的。
new Reflect() //毛病的写法
反射的运用
Reflect供应了一些静态要领,静态要领是指只能经由过程对象本身接见的的要领,这个学问在前面几章解说过。一切要领的细致剖析,前去 Reflect详解 检察。
静态要领列表:这么多静态要领,你须要学会的是怎样运用它们。
1、Reflect.apply()
2、Reflect.construct()
3、Reflect.defineProperty()
4、Reflect.deleteProperty()
5、Reflect.enumerate()
6、Reflect.get()
7、Reflect.getOwnPropertyDescriptor()
8、Reflect.getPrototypeOf()
9、Reflect.has()
10、Reflect.isExtensible()
11、Reflect.ownKeys()
12、Reflect.preventExtensions()
13、Reflect.set()
14、Reflect.setPrototypeOf()
静态要领的运用:
demo1:运用Reflect.get()猎取目的对象指定key的value。
let obj = {
a: 1
};
let s1 = Reflect.get(obj, "a")
console.log(s1) // 1
demo2:运用Reflect.apply给目的函数floor传入指定的参数。
const s2 = Reflect.apply(Math.floor, undefined, [1.75]);
console.log(s2) // 1
进一步明白Reflect
看了上面的例子和要领,我们晓得Reflect能够阻拦JavaScript代码,包含阻拦对象,阻拦函数等,然后对阻拦到的对象或许函数举行读写等操纵。
比方demo1的get()要领,阻拦obj对象,然后读取key为a的值。固然,不必反射也能够读取a的值。
再看demo2的apply()要领,这个要领你应当比较了解了,和数组中运用apply差别的是,Reflect.apply()供应了3个参数,第一个参数是反射的函数,背面2个参数才是和数组的apply一致。demo2的例子我们能够明白成是阻拦了Math.floor要领,然后传入参数,将返回值赋值给s2,如许我们就能在须要读取这个返回值的时刻挪用s2。
//数组运用apply
const arr = [1, 2, 3]
function a() {
return Array.concat.apply(null, arguments)
}
const s = a(arr)
console.log(s) // [1, 2 ,3]
实在Reflect的作用和我们下面要讲的Proxy是差不多的。
代办 Proxy
Proxy这个词相信你已听过无数遍了,我曾写过一篇webpack运用代办来阻拦指定域的API要求,转发到新的目的URL的文章 webpack中运用proxy。然则注重Proxy和proxy,大小写字母之间是差别的。本章讲的是大写字母开首的Proxy。
语法
let p = new Proxy(target, handler);
target:一个目的对象(能够是任何范例的对象,包含本机数组,函数,以至另一个代办)用Proxy来包装。
handler:一个对象,其属性是当实行一个操纵时定义代办的行动的函数。
代办的运用
基本demo:Proxy的demo有许多,我们只剖析基本demo,主要看new Proxy({}, handler)的操纵,指定目的obj对象,然后handler对象实行get()操纵,get()返回值的推断是,假如name是target目的对象的属性,则返回target[name]的值,不然返回37,末了测试的时刻,p.a是对象p的key,所以返回a的value,而p.b不存在,返回37。
const obj = {
a: 10
}
let handler = {
get: function(target, name){
console.log('test: ', target, name)
// test: {"a":10} a
// test: {"a":10} b
return name in target ? target[name] : 37
}
}
let p = new Proxy(obj, handler)
console.log(p.a, p.b) // 10 37
这个例子的作用是阻拦目的对象obj,当实行obj的读写操纵时,进入handler函数举行推断,假如读取的key不存在,则返回默认值。
我们运用一些http-proxy插件或许webpack的时刻,有时刻须要接见某个api时,跳转到指定的url,这类体式格局也能处理跨域接见。这类代办形式和Proxy的代办有异曲同工之妙。然则,别混为一体了。
module.exports = {
devServer: {
proxy: [
{
context: "/api/*", //代办API
target: 'https://www.hyy.com', //目的URL
secure: false
}
]
}
}
总结
无论是反射照样代办,除了他们运用要领差别以外,他们所作的事变异常类似,都能够明白成阻拦某个东西,然后实行某个函数操纵,再返回函数操纵的效果。
大部分前端在一样平常营业需求中,险些很少运用到这2个API,实际运用场景还得在今后的开辟中逐步发掘。