成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ES6之Reflect

BingqiChen / 3331人閱讀

摘要:查找并返回對象的屬性例例屬性部署了讀取函數(shù)返回的是的參數(shù)對象注意如果的第一個參數(shù)不是對象,則會報錯。它返回一個布爾值,表示是否操作成功用于返回對象的所有屬性使用和實現(xiàn)觀察者模式請參考觀察者模式

1、什么是Reflect?為操作對象而提供的新API

2、為什么要設(shè)計Reflect?
(1)將Object對象的屬于語言內(nèi)部的方法放到Reflect對象上,即從Reflect對象上拿Object對象內(nèi)部方法。
(2)將用 老Object方法 報錯的情況,改為返回false
老寫法

try {
Object.defineProperty(target, property, attributes);
// success
} catch (e) {
// failure
}
新寫法

if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}

(3)讓Object操作變成函數(shù)行為
老寫法(命令式寫法)
"name" in Object //true
新寫法
Reflect.has(Object,"name") //true
(4)Reflect與Proxy是相輔相成的,在Proxy上有的方法,在Reflect就一定有

let target={}
let handler={
set(target,proName,proValue,receiver){
//確認對象的屬性賦值成功
let isSuccess=Reflect.set(target,proName,proValue,receiver)
if(isSuccess){
console.log("成功")
}
return isSuccess
}
}
let proxy=new Proxy(target,handler)
確保對象的屬性能正確賦值,廣義上講,即確保對象的原生行為能夠正常進行,這就是Reflect的作用

3、Reflect的API
注:由于和Proxy的API一致,所以參數(shù)就不解釋了。

(1)Reflect.get(target,property,receiver)
查找并返回target對象的property屬性
例1:

let obj={
name:"chen",
}
let result=Reflect.get(obj,"name")
console.log(result) //chen
例2:

let obj={
//屬性yu部署了getter讀取函數(shù)
get yu(){
//this返回的是Reflect.get的receiver參數(shù)對象
return this.name+this.age
}
}

let receiver={
name:"shen",
age:"18",
}
let result=Reflect.get(obj,"yu",receiver)
console.log(result) //shen18
注意:如果Reflect.get()的第一個參數(shù)不是對象,則會報錯。

(2)Reflect.set(target,propName,propValue,receiver)
設(shè)置target對象的propName屬性為propValue
例1:

let obj={
name:"chen"
}

let result=Reflect.set(obj,"name","shi")
console.log(result) //true
console.log(obj.name) //shi
例2:原理同3(1)的例2

let obj={
age:38,
set setAge(value){
return this.age=value
}
}

let receiver={
age:28
}

let result=Reflect.set(obj,"setAge",18,receiver)
console.log(result) //true
console.log(obj.age) //38
console.log(receiver.age) //18
(3)Reflect.set與Proxy.set聯(lián)合使用,并且傳入receiver,則會進行定義屬性操作

let obj={
name:"chen"
}

let handler={
set(target,key,value,receiver){
console.log("Proxy攔截賦值操作")
//Reflect完成賦值操作
Reflect.set(target,key,value,receiver)
},
defineProperty(target,key,attribute){
console.log("Proxy攔截定義屬性操作")
//Reflect完成定義屬性操作
Reflect.defineProperty(target,key,attribute)
}
}

let proxy=new Proxy(obj,handler)
proxy.name="ya"
//Proxy攔截賦值操作
//Proxy攔截定義屬性操作

* 

為什么Reflect.set()傳入receiver參數(shù),就會觸發(fā)定義屬性的操作?
因為Proxy.set()中的receiver是Proxy的實例(詳情見這篇文章),即obj,而Reflect.set一旦傳入receiver,就會將屬性賦值到receiver上面,也是obj,所以就會觸發(fā)defineProperty攔截。

(4)Reflect.has(obj,name)

var obj= {
name: "chen",
};
老寫法
"name" in obj // true
新寫法
Reflect.has(obj, "name") // true

(5)Reflect.deleteProperty(obj, name)刪除對象的屬性
老寫法:
delete obj.name;
新寫法
Reflect.deleteProperty(obj, "name");
(6)Reflect.construct(target, args)

function Person(name) {
this.name = name;
}
new 的寫法
let person= new Person("chen")
Reflect.construct 的寫法
let person = Reflect.construct(Person, ["chen"]);

(7)Reflect.getPrototypeOf(obj)
用于讀取對象的proto屬性,對應(yīng)Object.getPrototypeOf(obj)

(8)Reflect.setPrototypeOf(obj, newProto)
設(shè)置目標對象的原型(prototype),對應(yīng)Object.setPrototypeOf(obj, newProto)方法

(9)Reflect.apply(func, thisArg, args)
繼承目標對象的特定方法
let array=[1,2,3,4,5,6]
老寫法:

let small= Math.min.apply(Math, array) //1
let big = Math.max.apply(Math, array) //6
let type = Object.prototype.toString.call(small) //"[object Number]"
新寫法:

const small= Reflect.apply(Math.min, Math, array)
const big = Reflect.apply(Math.max, Math, array)
//第三個參數(shù)是Object類型的就好,因為調(diào)用的是Object的原型方法toString
const type = Reflect.apply(Object.prototype.toString, small, [])
(10)Reflect.defineProperty(target, propertyKey, attributes)

function MyDate() {
...
...
}
老寫法

Object.defineProperty(MyDate, "now", {
value: () => Date.now()
});
新寫法

Reflect.defineProperty(MyDate, "now", {
value: () => Date.now()
});
與Proxy.defineProperty配合使用

let proxy = new Proxy({}, {
defineProperty(target, prop, descriptor) {
console.log(descriptor);
return Reflect.defineProperty(target, prop, descriptor);
}
});

proxy .name= "chen";
// {value: "chen", writable: true, enumerable: true, configurable: true}
p.name // "chen"
如上,Proxy.defineProperty對屬性賦值設(shè)置攔截,然后使用Reflect.defineProperty完成賦值

(11)Reflect.getOwnPropertyDescriptor(target, propertyKey)
基本等同于Object.getOwnPropertyDescriptor,用于得到指定屬性的描述對象

(12)Reflect.isExtensible (target)
對應(yīng)Object.isExtensible,返回一個布爾值,表示當前對象是否可擴展

(13)Reflect.preventExtensions(target)
對應(yīng)Object.preventExtensions方法,用于讓一個對象變?yōu)椴豢蓴U展。它返回一個布爾值,表示是否操作成功

(14)Reflect.ownKeys (target)
用于返回對象的所有屬性

4、使用Proxy和Reflect實現(xiàn)觀察者模式
請參考Javascript觀察者模式

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102865.html

相關(guān)文章

  • ES6Proxy & Reflection API

    摘要:的出現(xiàn),使用內(nèi)建對象的繼承得以實現(xiàn)。屬性不存在拋出異常是取值操作,而就是賦值操作,可以對屬性值進行驗證。屬性必須為數(shù)字拋出異常接受兩個參數(shù)被讀取屬性的原對象,即代理的目標。這個可以攔截內(nèi)部方法,通過返回數(shù)組的值可以覆寫其行為。 Proxy & Reflect extends的出現(xiàn),使用內(nèi)建對象的繼承得以實現(xiàn)。Proxy可以攔截JS引擎內(nèi)部目標的底層對象操作,這些底層操作被攔截后會觸發(fā)響...

    yearsj 評論0 收藏0
  • 《深入理解ES6》筆記——代理(Proxy)和反射(Reflection)API(12)

    摘要:方法與代理處理程序的方法相同。使用給目標函數(shù)傳入指定的參數(shù)。當然,不用反射也可以讀取的值。的例子我們可以理解成是攔截了方法,然后傳入?yún)?shù),將返回值賦值給,這樣我們就能在需要讀取這個返回值的時候調(diào)用。這種代理模式和的代理有異曲同工之妙。 反射 Reflect 當你見到一個新的API,不明白的時候,就在瀏覽器打印出來看看它的樣子。 showImg(https://segmentfault....

    ZHAO_ 評論0 收藏0
  • 《深入理解ES6》筆記——代理(Proxy)和反射(Reflection)API(12)

    摘要:方法與代理處理程序的方法相同。使用給目標函數(shù)傳入指定的參數(shù)。當然,不用反射也可以讀取的值。的例子我們可以理解成是攔截了方法,然后傳入?yún)?shù),將返回值賦值給,這樣我們就能在需要讀取這個返回值的時候調(diào)用。這種代理模式和的代理有異曲同工之妙。 反射 Reflect 當你見到一個新的API,不明白的時候,就在瀏覽器打印出來看看它的樣子。 showImg(https://segmentfault....

    shiina 評論0 收藏0
  • 深入理解ES6《代理和反射》

    摘要:使用陷阱驗證屬性用于接收屬性代理的目標的對象要寫入的屬性鍵被寫入的屬性的值操作發(fā)生的對象通常是代理屬性必須是數(shù)字拋錯用陷阱驗證對象結(jié)構(gòu)屬性不存在拋出錯誤使用陷阱隱藏已有屬性可以用操作符來檢測給定對象中是否包含有某個屬性,如果自有屬性或原型屬 使用set陷阱驗證屬性 let target = { name: target } let proxy = new Proxy(targe...

    Stardustsky 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<