ES6個人筆記記錄 Reflect1

2021-10-05 21:28:30 字數 1778 閱讀 1538

reflect物件和proxy物件一樣,也是es6為了操作物件而提供的api

reflect物件的設計目的有以下幾個:

1.將object物件的一些明顯屬於語言內部的方法		(比如:object.defineproperty)放到reflect物件上。現階段,某些方法同時在object和reflect物件上部署,未來的新方法將只在reflect物件上部署,也就是說:從reflect物件上可以	獲得語言內部的方法

2.修改某些object方法的返回結果,讓其變得更合理。(比如:object.defineproperty(obj,name,desc)在無法定義屬性時會丟擲乙個錯誤,而reflect.defineproperty(obj,name,desc)則會返回false)

3.讓object操作都變成函式行為。某些object操作是命令式。(比如name in obj和delete obj[name],而reflect.has(obj,name)和reflect.deleteproperty(obj,name)讓他們變成了函式行為)

4.reflect物件的方法與proxy物件的方法一一對應,只要是proxy物件的方法, 、就能在reflect物件上找到對應的方法。這就使proxy物件可以方便地呼叫對應的reflect方法來完成預設行為,作為修改行為的基礎。也就是說,無論proxy怎麼修改預設行為,我們總可以在reflect上獲取預設行為

1和2條的例子

// 舊寫法

trycatch

(e)// 新寫法

if(reflect.

defineproperty

(target,property,attributes)

)else

3條的例子

// 舊寫法

console.

log(

'assign'

in object)

;// 新寫法

console.

log(reflect.

has(object,

'assign'))

;

4條的例子

const

= reflect;

proxy

(target,

return success;}}

)

**中,proxy方法攔截target物件的屬性賦值行為。

它採用reflect.set方法將值賦給物件的屬性,確保完成原有的行為,然後再部署額外的功能

let loggedobj =

newproxy

(obj,

,deleteproperty

(target,name)

,has

(target,name)

})

上面的**中,m每乙個proxy物件的攔截操作(get,delete,has)內部都呼叫對應的reflect方法,保證原生行為能正常執行,新增的工作就是將每乙個操作輸出乙個日誌

有了reflect物件,很多操作更易讀

// 舊寫法

console.

logcall

(math.floor,undefined,[1

,75])

);// 新寫法

console.

log(reflect.

(math.floor,undefined,[1

,75])

);

ES6個人筆記記錄 Symbol

es5 的物件屬性名都是字串,這容易造成屬性名的衝突 比如,我們使用了乙個他人提供的物件,但又想為這個物件新增新的方法cmixin 模式 新方法的名字就有可能與現有方法產生衝突。es6引入了一種新的原始資料型別symbol,表示獨一無二的值 是第七種資料型別 1.number 2.string 3....

ES6個人筆記記錄 陣列擴充套件

擴充套件運算子 console.log 1,2,3,4 5 es5 console.log math.max.null,14,2,48 es6 let math console.log max 14,2,48 es5 var arr1 0 1,2 var arr2 3 4,5 console.log...

ES6個人筆記記錄 Proxy2

1.getlet person let proxy1 newproxy person,else console.log proxy1.name,proxy1.age get方法可以被繼承 let proto newproxy const object const reflect let obj1 c...