ES6-8 - 函数名/对象拓展、描述符、getter/setter
函數名
有兩種特殊情況:bind方法創造的函數,name屬性返回bound加上原函數的名字;Function構造函數創造的函數,name屬性返回anonymous。
- bind函數名
- getter setter
如果對象的方法使用了取值函數(getter)和存值函數(setter),則name屬性不是在該方法上面,而是該方法的屬性的描述對象的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"對象方法的簡寫
const o = {method() {return "Hello!";} };- node common.js寫法+
屬性名表達式
ES6 允許字面量定義對象時,用方法二(表達式)作為對象的屬性名,即把表達式放在方括號內。
let propKey = 'foo';let obj = {[propKey]: true,['a' + 'bc']: 123 }; let obj = {['h' + 'ello']() {return 'hi';} };obj.hello() // hi- 屬性名可以重復,重復則覆蓋
屬性描述符
- getOwnPropertyDescriptor是構造器上的方法
- 方法返回指定對象上一個自有屬性對應的屬性描述符。(自有屬性指的是直接賦予該對象的屬性,不需要從原型鏈上進行查找的屬性)若無返回undefined
- Object.getOwnPropertyDescriptor(obj, prop)
一個屬性描述符是一個記錄,由下面屬性當中的某些組成的:
該屬性的值(僅針對數據屬性描述符有效)
當且僅當屬性的值可以被改變時為true。(僅針對數據屬性描述有效)
重新賦值,不包括刪除!
獲取該屬性的訪問器函數(getter)。如果沒有訪問器, 該值為undefined。(僅針對包含訪問器或設置器的屬性描述有效)
獲取該屬性的設置器函數(setter)。 如果沒有設置器, 該值為undefined。(僅針對包含訪問器或設置器的屬性描述有效)
當且僅當指定對象的屬性描述可以被改變或者屬性可被刪除時,為true。
delete obj.a
當且僅當指定對象的屬性可以被枚舉出時,為 true。
- 注意:在 ES5 中,如果該方法的第一個參數不是對象(而是原始類型),那么就會產生出現 TypeError。而在 ES2015,第一個的參數不是對象的話就會被強制轉換為對象。
getter、setter在對象上
使用Object.defineProperties的方法,同樣也可以對一個已創建的對象在任何時候為其添加getter或setter方法。這個方法的第一個參數是你想定義getter或setter方法的對象,第二個參數是一個對象,這個對象的屬性名用作getter或setter的名字,屬性名對應的屬性值用作定義getter或setter方法的函數。
- set必須要有參數,否則報錯Uncaught SyntaxError: Setter must have exactly one formal parameter.
mdn getter
mdn setter
- a也是o的屬性,只是用getter、setter劫持了
- 如果getter和屬性重名,會報錯 Uncaught RangeError: Maximum call stack size exceeded
不可能同時將一個 getter 綁定到一個屬性并且該屬性實際上具有一個值。
使用get語法時,不能與另一個 get 或具有相同屬性的數據條目同時出現在一個對象字面量中。
不允許使用 { get x() { }, get x() { } } 和 { x: …, get x() { } })。
在對象字面量中,不能為一個已有真實值的變量使用 set ,也不能為一個屬性設置多個 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一般是成對出現的,并且不應寫死,不然沒有意義
getter/setter → 偽屬性
- Object.defineProperty與創建對象時定義getter/setter的區別
- Object.defineProperty的getter/setter/其余普通屬性不可枚舉、不可配置
總結
以上是生活随笔為你收集整理的ES6-8 - 函数名/对象拓展、描述符、getter/setter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3481. 阶乘的和
- 下一篇: ES6-9 对象密封4种方式、assig