進(jìn)入網(wǎng)站服務(wù)器怎么做推廣有什么好方法
1. 什么是 Reflect
Reflect 可以調(diào)用對(duì)象的基本方法(內(nèi)部方法),在 ES6 之前我們是沒(méi)有任何方法去直接調(diào)用對(duì)象的基本方法的。只能間接調(diào)用,間接調(diào)用它又會(huì)給你做一些額外得事。
2. 對(duì)象的基本方法
什么是對(duì)象的基本方法呢,對(duì)象內(nèi)部運(yùn)行的方法就是對(duì)象的基本方法。對(duì)象的基本方法有哪些,它對(duì)應(yīng)的反射方法是什么。如下:
// 基本方法 => 反射方法
[[GetOwnProperty]] => getPrototypeOf();
[[SetPrototypeOf]] => setPrototypeOf();
[[IsExtensible]] => isExtensible();
[[PreventExtensions]] => preventExtensions();
[[GetOwnProperty]] => getOwnPropertyDescriptor();
[[DefineOwnProperty]] => defineProperty();
[[HasProperty]] => has();
[[GET]] => get();
[[SET]] => set();
[[DELETE]] => deleteProperty();
[[OwnPropertyKeys]] => ownKeys()
3. Reflect 有什么用
我們舉個(gè)例子,下面這兩個(gè)語(yǔ)句是同樣的作用,都是設(shè)置 name 的值:
let obj = { name: "yq" };
obj.name = "yqcoder";
console.log(obj); // { name: 'yqcoder' }
let obj = { name: "yq" };
Reflect.set(obj, "name", "yqcoder");
console.log(obj); // { name: 'yqcoder' }
那么既然都是做的同樣的是,它們有什么區(qū)別呢。區(qū)別在于,通過(guò)語(yǔ)法或者一些 API 去調(diào)用對(duì)象的內(nèi)部方法的話,它會(huì)經(jīng)過(guò)一些規(guī)則和步驟,在這些規(guī)則和步驟當(dāng)中,有一步是在調(diào)用這個(gè)內(nèi)部方法。如果你不希望有這些額外步驟存在,那就需要你直接去調(diào)用對(duì)象的基本方法了。使用 Reflect。
4. 為什么要用 Reflect
有小伙伴就問(wèn)了,我為啥要直接調(diào)用對(duì)象的基本方法,用語(yǔ)法進(jìn)行對(duì)象操作不好嗎??隙ㄊ且?yàn)?Reflect 可以做一些語(yǔ)法做不到的事,我們才會(huì)去使用 Reflect。比如:
let obj = {a: 1,b: 2,get c() {return this.a + this.b;},
};
obj.c; // 3
上面的 obj.c 實(shí)際是通過(guò)[[GET]](obj, 'c', obj),去得到的值,當(dāng)我們想通過(guò) obj.c 改變 this 的指向,這時(shí)做不到的,用 Reflect 就可以。如下,就改變了 this 的指向。
let obj = {a: 1,b: 2,get c() {return this.a + this.b;},
};
Reflect.get(obj, "c", { a: 3, b: 4 }); // 7
另外,有的時(shí)候我們?nèi)シ庋b代理對(duì)象的時(shí)候,也需要用到 Reflect,比如,我們需要得到這么一個(gè)代理,訪問(wèn) proxy.c 時(shí),需要將 a,b 一起打印出來(lái)。
let obj = {a: 1,b: 2,get c() {return this.a + this.b;},
};
const proxy = new Proxy(obj, {get(target, key) {console.log(key);return Reflect.get(target, key, proxy);},
});
proxy.c; // c a b
?再比如,我們需要獲取到對(duì)象得所有屬性
let obj = {a: 1,b: 2,
};
Object.defineProperty(obj, "c", {value: 3,enumerable: false,
});
Object.keys(obj); // ['a', 'b']
Reflect.ownKeys(obj); // ['a', 'b', 'c']