1、Reflect是什麼?
答:為了操作對象而提供的一個API。
2、Reflect常見的靜態方法有哪些?
答:一共有13個靜態方法,目前先要求掌握的有:get, set, has, ownKeys.
3、如何利用Reflect查找對象的某個屬性?如果該屬性不存在,返回的值是什麼?
答:利用Reflect的get方法。屬性不存在時,返回undefined。代碼如下:
var myObj = {
foo: 1,
bar: 2,
get baz(){
return this.foo + this.bar
}
}
let a = Reflect.get(myObj,'foo');
let b = Reflect.get(myObj,'bar');
let c = Reflect.get(myObj,'baz');
let d = Reflect.get(myObj,'name')
console.log(a,b,c,d) //1,2,3,undefined
4、get方法裏的第三個參數是做什麼用的?
答:語法是Reflect(target, name, receiver),傳遞兩個或三個參數。
如果target的name屬性部署了讀取函數(getter),則讀取函數的this綁定target,如果存在receiver,則讀取函數的this綁定receiver。代碼如下:
var person={
name:"Alice",
age: 18,
get say(){
console.log(this.name + "今年" + this.age)
}
}
let receiverObj = {
name: "Tom",
age: "27"
}
Reflect.get(person, 'say', receiverObj) //直接執行了這個方法,輸出的內容為:Tom今年27
延伸:get的用法。
如果有一個數組list,list的每一項都是一個對象。對象裏面包含有一個name屬性。可以利用Reflect.get將list裏面每個對象的name屬性挑選出來,整理成一個數組。這樣比for in
快的多。
5、set的用法
var myObj = {
foo: 1,
set bar(value){
return this.foo = value;
}
}
Reflect.set(myObj, 'foo', 2);
console.log(myObj.foo) //2
6、set的第四個參數有什麼用?
答:set的語法結構是:Reflect(obj, name, value, receiverObj)。如果name屬性設置了賦值函數,則賦值函數的this指向receiverObj。
var myObj = {
foo: 1,
set bar(value){
return this.foo = value;
}
}
let receiverObj = {
foo: 4
}
Reflect.set(myObj, 'foo', 2, receiverObj);
console.log(myObj.foo) //1
console.log(receiverObj.foo) //2
延伸:同get 一樣,如果最後一位填寫了receiverObj,就將this指向receiverObj。但是注意,這個的用法需要在目標對象上為這些屬性設定get 和set 的方法。
7、has的用法
可以用來判斷對象中是否存在某個屬性。感覺這比proxy簡單多了。
let person = {
name: 'Alice',
age: 18
}
let property = 'name'
console.log(Reflect.has(person,property))//true
console.log(Reflect.has(person,'hobby')) //false
8、ownKeys的用法
用來返回所有的對象裏的所有屬性名稱。
let person = {
name: 'Alice',
age: 18
}
console.log(Reflect.ownKeys(person)) //Array(2) ["name", "age"]
9、觀察者模式
函數自動觀察數據對象。一旦對象有變化,函數就會自動執行。
它由兩部分組成,觀察目標和觀察者。
let person = observable({
name: 'Alice',
age: 18
})
function print() {
console.log(`${person.name},${person.age}`)
}
observe(print);
person.name = 'Tom'
const queen = new Set();
const observe = (fn) => {
queen.add(fn);
}
const observable = function(obj) {
return new Proxy(obj,{set})
}