国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ES6之Reflect

BingqiChen / 3327人閱讀

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

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

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

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

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

(3)讓Object操作變成函數行為
老寫法(命令式寫法)
"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一致,所以參數就不解釋了。

(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讀取函數
get yu(){
//this返回的是Reflect.get的receiver參數對象
return this.name+this.age
}
}

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

(2)Reflect.set(target,propName,propValue,receiver)
設置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聯合使用,并且傳入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參數,就會觸發定義屬性的操作?
因為Proxy.set()中的receiver是Proxy的實例(詳情見這篇文章),即obj,而Reflect.set一旦傳入receiver,就會將屬性賦值到receiver上面,也是obj,所以就會觸發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屬性,對應Object.getPrototypeOf(obj)

(8)Reflect.setPrototypeOf(obj, newProto)
設置目標對象的原型(prototype),對應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)
//第三個參數是Object類型的就好,因為調用的是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對屬性賦值設置攔截,然后使用Reflect.defineProperty完成賦值

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

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

(13)Reflect.preventExtensions(target)
對應Object.preventExtensions方法,用于讓一個對象變為不可擴展。它返回一個布爾值,表示是否操作成功

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

4、使用Proxy和Reflect實現觀察者模式
請參考Javascript觀察者模式

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102865.html

相關文章

  • ES6Proxy & Reflection API

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

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

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

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

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

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

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

    Stardustsky 評論0 收藏0

發表評論

0條評論

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