ES6-8 - 函数名/对象拓展、描述符、getter/setter
函數(shù)名
有兩種特殊情況:bind方法創(chuàng)造的函數(shù),name屬性返回bound加上原函數(shù)的名字;Function構(gòu)造函數(shù)創(chuàng)造的函數(shù),name屬性返回anonymous。
- bind函數(shù)名
- getter setter
如果對(duì)象的方法使用了取值函數(shù)(getter)和存值函數(shù)(setter),則name屬性不是在該方法上面,而是該方法的屬性的描述對(duì)象的get和set屬性上面,返回值是方法名前加上get和set。
const obj = {get foo() {},set foo(x) {} };obj.foo.name // TypeError: Cannot read property 'name' of undefinedconst descriptor = Object.getOwnPropertyDescriptor(obj, 'foo');descriptor.get.name // "get foo" descriptor.set.name // "set foo"對(duì)象方法的簡(jiǎn)寫
const o = {method() {return "Hello!";} };- node common.js寫法+
屬性名表達(dá)式
ES6 允許字面量定義對(duì)象時(shí),用方法二(表達(dá)式)作為對(duì)象的屬性名,即把表達(dá)式放在方括號(hào)內(nèi)。
let propKey = 'foo';let obj = {[propKey]: true,['a' + 'bc']: 123 }; let obj = {['h' + 'ello']() {return 'hi';} };obj.hello() // hi- 屬性名可以重復(fù),重復(fù)則覆蓋
屬性描述符
- getOwnPropertyDescriptor是構(gòu)造器上的方法
- 方法返回指定對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的屬性描述符。(自有屬性指的是直接賦予該對(duì)象的屬性,不需要從原型鏈上進(jìn)行查找的屬性)若無(wú)返回undefined
- Object.getOwnPropertyDescriptor(obj, prop)
一個(gè)屬性描述符是一個(gè)記錄,由下面屬性當(dāng)中的某些組成的:
該屬性的值(僅針對(duì)數(shù)據(jù)屬性描述符有效)
當(dāng)且僅當(dāng)屬性的值可以被改變時(shí)為true。(僅針對(duì)數(shù)據(jù)屬性描述有效)
重新賦值,不包括刪除!
獲取該屬性的訪問(wèn)器函數(shù)(getter)。如果沒(méi)有訪問(wèn)器, 該值為undefined。(僅針對(duì)包含訪問(wèn)器或設(shè)置器的屬性描述有效)
獲取該屬性的設(shè)置器函數(shù)(setter)。 如果沒(méi)有設(shè)置器, 該值為undefined。(僅針對(duì)包含訪問(wèn)器或設(shè)置器的屬性描述有效)
當(dāng)且僅當(dāng)指定對(duì)象的屬性描述可以被改變或者屬性可被刪除時(shí),為true。
delete obj.a
當(dāng)且僅當(dāng)指定對(duì)象的屬性可以被枚舉出時(shí),為 true。
- 注意:在 ES5 中,如果該方法的第一個(gè)參數(shù)不是對(duì)象(而是原始類型),那么就會(huì)產(chǎn)生出現(xiàn) TypeError。而在 ES2015,第一個(gè)的參數(shù)不是對(duì)象的話就會(huì)被強(qiáng)制轉(zhuǎn)換為對(duì)象。
getter、setter在對(duì)象上
使用Object.defineProperties的方法,同樣也可以對(duì)一個(gè)已創(chuàng)建的對(duì)象在任何時(shí)候?yàn)槠涮砑觛etter或setter方法。這個(gè)方法的第一個(gè)參數(shù)是你想定義getter或setter方法的對(duì)象,第二個(gè)參數(shù)是一個(gè)對(duì)象,這個(gè)對(duì)象的屬性名用作getter或setter的名字,屬性名對(duì)應(yīng)的屬性值用作定義getter或setter方法的函數(shù)。
- set必須要有參數(shù),否則報(bào)錯(cuò)Uncaught SyntaxError: Setter must have exactly one formal parameter.
mdn getter
mdn setter
- a也是o的屬性,只是用getter、setter劫持了
- 如果getter和屬性重名,會(huì)報(bào)錯(cuò) Uncaught RangeError: Maximum call stack size exceeded
不可能同時(shí)將一個(gè) getter 綁定到一個(gè)屬性并且該屬性實(shí)際上具有一個(gè)值。
使用get語(yǔ)法時(shí),不能與另一個(gè) get 或具有相同屬性的數(shù)據(jù)條目同時(shí)出現(xiàn)在一個(gè)對(duì)象字面量中。
不允許使用 { get x() { }, get x() { } } 和 { x: …, get x() { } })。
在對(duì)象字面量中,不能為一個(gè)已有真實(shí)值的變量使用 set ,也不能為一個(gè)屬性設(shè)置多個(gè) set。
( { set x(v) { }, set x(v) { } } 和 { x: …, set x(v) { } } 是不允許的 )
- Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #<Object>
- get和set一般是成對(duì)出現(xiàn)的,并且不應(yīng)寫死,不然沒(méi)有意義
getter/setter → 偽屬性
- Object.defineProperty與創(chuàng)建對(duì)象時(shí)定義getter/setter的區(qū)別
- Object.defineProperty的getter/setter/其余普通屬性不可枚舉、不可配置
總結(jié)
以上是生活随笔為你收集整理的ES6-8 - 函数名/对象拓展、描述符、getter/setter的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 3481. 阶乘的和
- 下一篇: 乐优商城个人笔记上-主要框架、基础知识、