成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

ES6之Reflect

BingqiChen / 3389人閱讀

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

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

2、為什么要設(shè)計(jì)Reflect?
(1)將Object對(duì)象的屬于語(yǔ)言內(nèi)部的方法放到Reflect對(duì)象上,即從Reflect對(duì)象上拿Object對(duì)象內(nèi)部方法。
(2)將用 老Object方法 報(bào)錯(cuò)的情況,改為返回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){
//確認(rèn)對(duì)象的屬性賦值成功
let isSuccess=Reflect.set(target,proName,proValue,receiver)
if(isSuccess){
console.log("成功")
}
return isSuccess
}
}
let proxy=new Proxy(target,handler)
確保對(duì)象的屬性能正確賦值,廣義上講,即確保對(duì)象的原生行為能夠正常進(jìn)行,這就是Reflect的作用

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

(1)Reflect.get(target,property,receiver)
查找并返回target對(duì)象的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ù)對(duì)象
return this.name+this.age
}
}

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

(2)Reflect.set(target,propName,propValue,receiver)
設(shè)置target對(duì)象的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,則會(huì)進(jìn)行定義屬性操作

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ù),就會(huì)觸發(fā)定義屬性的操作?
因?yàn)镻roxy.set()中的receiver是Proxy的實(shí)例(詳情見(jiàn)這篇文章),即obj,而Reflect.set一旦傳入receiver,就會(huì)將屬性賦值到receiver上面,也是obj,所以就會(huì)觸發(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)刪除對(duì)象的屬性
老寫法:
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)
用于讀取對(duì)象的proto屬性,對(duì)應(yīng)Object.getPrototypeOf(obj)

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

(9)Reflect.apply(func, thisArg, args)
繼承目標(biāo)對(duì)象的特定方法
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)
//第三個(gè)參數(shù)是Object類型的就好,因?yàn)檎{(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對(duì)屬性賦值設(shè)置攔截,然后使用Reflect.defineProperty完成賦值

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

(12)Reflect.isExtensible (target)
對(duì)應(yīng)Object.isExtensible,返回一個(gè)布爾值,表示當(dāng)前對(duì)象是否可擴(kuò)展

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/102865.html

相關(guān)文章

  • ES6Proxy & Reflection API

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

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

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

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

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

    shiina 評(píng)論0 收藏0
  • 深入理解ES6《代理和反射》

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

    Stardustsky 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<