ES6-8 - 函數名/對象拓展、描述符、getter/setter

函數名

有兩種特殊情況:bind方法創造的函數,name屬性返回bound加上原函數的名字;Function構造函數創造的函數,name屬性返回anonymous。

  • bind函數名
// 以bound開頭
function foo() { }
const fnName = foo.bind().name
console.log(fnName) // bound foo
  • 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
  • 屬性名可以重復,重復則覆蓋
let b = 'b'
let obj = {['a' + 'b'] : undefined,['a' + b] : 1, // 屬性名和上面重復,永遠取最后的,obj最后依然只有一個鍵‘ab’
}
屬性名表達式如果是一個對象,默認情況下會自動將對象轉為字符串[object Object],這一點要特別小心。
const keyA = {a: 1};
const keyB = {b: 2};const myObject = {[keyA]: 'valueA',[keyB]: 'valueB'
};myObject // Object {[object Object]: "valueB"}
// 1. 屬性名相同覆蓋
// 2. 將一切js變量轉為字符串,作為屬性名
  1. 一個對象的屬性名可以是任何有效的 JavaScript 字符串,或者可以被轉換為字符串的任何類型,包括空字符串。然而,一個屬性的名稱如果不是一個有效的 JavaScript 標識符(例如,一個由空格或連字符,或者以數字開頭的屬性名),就只能通過方括號標記訪問。這個標記法在屬性名稱是動態判定(屬性名只有到運行時才能判定)時非常有用。
  2. JavaScript中的對象只能使用String類型作為鍵類型。

屬性描述符

  • getOwnPropertyDescriptor是構造器上的方法
  • 方法返回指定對象上一個自有屬性對應的屬性描述符。(自有屬性指的是直接賦予該對象的屬性,不需要從原型鏈上進行查找的屬性)若無返回undefined
  • Object.getOwnPropertyDescriptor(obj, prop)
    在這里插入圖片描述

一個屬性描述符是一個記錄,由下面屬性當中的某些組成的:

  1. value
    該屬性的值(僅針對數據屬性描述符有效)
  2. writable
    當且僅當屬性的值可以被改變時為true。(僅針對數據屬性描述有效)
    重新賦值,不包括刪除!
  3. get
    獲取該屬性的訪問器函數(getter)。如果沒有訪問器, 該值為undefined。(僅針對包含訪問器或設置器的屬性描述有效)
  4. set
    獲取該屬性的設置器函數(setter)。 如果沒有設置器, 該值為undefined。(僅針對包含訪問器或設置器的屬性描述有效)
  5. configurable
    當且僅當指定對象的屬性描述可以被改變或者屬性可被刪除時,為true。
    delete obj.a
  6. enumerable
    當且僅當指定對象的屬性可以被枚舉出時,為 true。
Object.defineProperty(o, "baz", {value: 8675309,writable: false, // 重寫baz屬性會靜默失敗;而嚴格模式重寫則報錯enumerable: false
});
  • 注意:在 ES5 中,如果該方法的第一個參數不是對象(而是原始類型),那么就會產生出現 TypeError。而在 ES2015,第一個的參數不是對象的話就會被強制轉換為對象。
Object.getOwnPropertyDescriptor('foo', 0);
// 類型錯誤: "foo" 不是一個對象  // ES5 codeObject.getOwnPropertyDescriptor('foo', 0);
// Object returned by ES2015 code: {
//   configurable: false,
//   enumerable: true,
//   value: "f",
//   writable: false
// }

getter、setter在對象上

使用Object.defineProperties的方法,同樣也可以對一個已創建的對象在任何時候為其添加getter或setter方法。這個方法的第一個參數是你想定義getter或setter方法的對象,第二個參數是一個對象,這個對象的屬性名用作getter或setter的名字,屬性名對應的屬性值用作定義getter或setter方法的函數。

  • set必須要有參數,否則報錯Uncaught SyntaxError: Setter must have exactly one formal parameter.
var o = {a: 7,get b() { return this.a + 1;},set c(x) {this.a = x / 2}
};console.log(o.a); // 7 
console.log(o.b); // 8 注意訪問方式 get直接讀
o.c = 50; // set要賦值
console.log(o.a); // 25
var language = {set add(name){this.ln.push(name)},ln: []
}
language.add = 'EN'
language.add = 'FN'
console.log(language.ln) // ["EN","FN"]

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) { } } 是不允許的 )

var o = {_a: 7,get a() { return this._a + 1;},set a(x) {this._a = x / 2}
};console.log(o.a); // 8
o.a = 10
console.log(o.a); // 6
console.log(Object.keys(o)) // ["_a","a"]

在這里插入圖片描述

  • Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #<Object>
var obj = {get a(){return 2}
}
// 注意:這里也不能再為已有的對象屬性,使用defineProperty
Object.defineProperty(obj, 'b', {get: function(){return this.a + 100},// value: 2 寫了get不能再寫value/writable,否則報錯
})
console.log(obj.a) // 2
console.log(obj.b) // 102
  • get和set一般是成對出現的,并且不應寫死,不然沒有意義

getter/setter → 偽屬性

  • Object.defineProperty與創建對象時定義getter/setter的區別
  • Object.defineProperty的getter/setter/其余普通屬性不可枚舉、不可配置
const obj = {a: 2
}
Object.defineProperty(obj, 'b', {set: function (x) {this.a = x}
})
const res = Object.getOwnPropertyDescriptor(obj, 'b')
console.log(res)
console.log(Object.keys(obj))const obj2 = {_a: 2,get a() {return this._a},set a(val) {this._a = val}
}
const res2 = Object.getOwnPropertyDescriptor(obj2, 'a')
console.log(res2)
console.log(res2.get.name) // get a
console.log(res2.set.name) // set a
console.log(Object.keys(obj2))

在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251021.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251021.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251021.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

javascript --- 再識閉包

看下面一個例子: function zipCode(code, location) {let _code code;let _location location || ;return {code: function () {return _code;},location: function() {return _location;}} }再上述封閉的函數中,code的匿名函數根據作用域鏈可以訪問到外面的_code變量. con…

iframe.contentWindow介紹

一、在使用iframe的頁面&#xff0c;要操作這個iframe里面的DOM元素可以用&#xff1a; contentWindow、contentDocument(測試的時候chrome瀏覽器&#xff0c;要在服務器環境下) 1、先獲取iframe里面的window對象&#xff0c;再通過這個對象&#xff0c;獲取到里面的DOM元素 例…

ES6-9 對象密封4種方式、assign、取值函數的拷貝

一 對象密封 1 Object.preventExtensions 禁止對象拓展&#xff0c;仍可刪除 嚴格模式下報錯 const origin {a: 1 } const fixed Object.preventExtensions(origin) console.log(origin fixed) // true console.log(Object.isExtensible(origin)) // false 不可拓展 orig…

MySQL入門命令

我主要是在維護OpenStack云平臺的時候會涉及MySQL數據庫的操作&#xff0c;這里就跟大家分享一下常用的簡單命令&#xff0c;也為自己做個小練習。 1.登錄MySQL數據庫 mysql -h localhost -u root -p 123456 其中&#xff0c;-h&#xff1a;mysql服務器的IP地址或主機名&#x…

【模板】分塊

題意簡述 已知一個數列&#xff0c;你需要進行下面兩種操作&#xff1a; 1.將某區間每一個數加上x 2.求出某區間每一個數的和 題解思路 對于一個長度為n的序列&#xff0c;我們可以講其中的元素分為\( \sqrt{n} \) 個連續的子序列&#xff0c;每塊的長度自然就為\( \sqrt{n} \)…

javascript --- 使用ajax與服務器進行通信

Ajax: (Asynchronous JavaScript and XML,異步JavaScript與XML技術)是一種有效利用JavaScript和DOM的操作. 與傳統HTTP請求的區別: Ajax允許只更新頁面的一部分,因此減少了響應中傳輸的數據量 Ajax的API: Ajax與服務器進行通信,可以使用JavaScript中原生的XMLHttpRequest對象…

ES6-10 super、4種遍歷方式、原型、symbol遍歷

由于現代 JavaScript 引擎優化屬性訪問所帶來的特性的關系&#xff0c;更改對象的 [[Prototype]]即__proto__在各個瀏覽器和 JavaScript 引擎上都是一個很慢的操作。 一 Object原型方法 1 Object.setPrototypeOf(obj, proto) 用該方法而不是直接修改__proto__返回值是設置好原…

IntelliJ IDEA使用

1&#xff1a;下載 ideaIU-2017.2.exe&#xff0c;JetbrainsCrack-2.6.2.jar(補丁) 2&#xff1a;安裝ideaIU-2017.2.exe&#xff0c;將補丁放在D:\java\intellij\IntelliJ IDEA 2017.2\bin 目錄下 3&#xff1a;在安裝的idea下面的bin目錄下面有2個文件 &#xff1a; 一個是id…

js中如何刪除json對象的某一個選項

我有一個這樣一個對象&#xff0c;getData, 但是我不想要每一項的id&#xff0c;那怎么去刪除呢(使用delete)? getData.map((item) >{delete item["id"];});console.log(getData);轉載于:https://www.cnblogs.com/mmykdbc/p/8386407.html

ES6-11 Symbol、iterator、forOf、typeArray

…剩余運算符 const obj1 {a: 1,b: 2 } const obj2 {a: 100,b: 2,c: 300 } const obj {...obj1,...obj2 } console.log(obj) // 和Object.assign(obj, obj1, obj2)結果相同[Symbol.hasInstance] Symbol構造函數上的屬性&#xff0c;默認調用了方法 iterator迭代器 對數…

node --- 游走在客戶端和服務器間的http

本篇文章,講述了一個很簡單的上傳圖片(/start)到本地服務器,然后路由跳轉到/upload. 寫這個程序的目的是為了幫助理解HTTP的一些基本概念及node對于http api的實現以及程序的設計模式. IP: 計算機之間的通信 TCP: 應用程序之間的通信 HTTP: 基于TCP實現的應用層協議,設計之初是…

BigDecimal踩過的大坑

通常Java中涉及金錢相關的計算為了保持精度&#xff0c;會采用BigDecimal來實現&#xff0c;但是BigDecimal中創建BigDecimal類對象的時候&#xff0c;如果使用直接new的話&#xff0c;必須是String類型的參數&#xff0c;否則會導致創建出來的對象不是你想要的&#xff0c;比如…

redis配置環境變量

直接上圖不解釋 redis安裝路徑&#xff0c;我的電腦右擊屬性 窗口R鍵&#xff0c;輸入cmd回車&#xff0c;輸入redis-server.exe 回車 再開一個命令窗口&#xff0c;窗口R鍵&#xff0c;輸入cmd回車&#xff0c;輸入 redis-cli.exe -h 127.0.0.1 -p 6379 回車 轉載于:https:/…

對轉義字符的思考

ASCII碼 計算機存儲文字時用的是二進制&#xff0c;ASCII碼就是一張對照表&#xff0c;什么字符對應什么碼&#xff0c;將二進制碼存儲下來0-127位表示基礎的ASCII碼0-31&#xff0c;和127表示非打印控制字符&#xff08;如換行、回車、響鈴、文頭、文尾&#xff09;32-126表示…

進程總結

進程總結 進程&#xff1a; 正在進行的一個過程或者說一個任務 進程是計算機中資源分配的最小單位 多進程之間的數據是隔離的 多進程是用來解決高計算型的程序用的 啟動進程的開銷比較大&#xff0c;其開啟數量和cpu的個數相關&#xff0c;正常在cpu的個數1-2倍之間 進程越多&a…

debian如何安裝Let's Encrypt

如果python默認版本不是2&#xff0c;刪除 /usr/bin/python 添加軟引用 in -s /usr/bin/python2 /usr/bin/python 第一步&#xff0c;卸載virtualenv apt-get purge python-virtualenv python3-virtualenv virtualenv 如果pip沒有就安裝pip apt-get install python-pip pip …

算法 --- 判斷某個值是否在二叉搜索樹中

function funA(root, k) {if(root null) {return false} else {if(k root.val) {return true } else {if( k < root.val) {return funA(root.left, k)} else {return funA(root.right, k)}}} }

ES6-12 array/數值拓展、ArrayOf、ArrayFrom

要使用…須有迭代器接口 數組方法 構造器上的方法 Array.of()聲明數組 替代new Array()的方式聲明數組new Array()不傳參數返回空數組&#xff0c;只傳1個參數時&#xff0c;代表數組長度&#xff0c;內容用empty填充&#xff0c;傳多個參數&#xff0c;則代表數組內容&…

React01

目錄 React-day01 入門知識React介紹官網React開發環境初始化 SPA腳手架初始化項目&#xff08;方便&#xff0c;穩定&#xff09;*通過webpack進行初始化配置鏡像地址開發工具配置元素渲染組件及組件狀態函數定義組件(無狀態)類定義組件(有狀態)*組合組件Props屬性*State狀態*…

算法 --- 反轉數組

幾個注意點: 1.輸出的時候,也要做數字超出處理 2.js中可以使用 str -0 將字符串類型轉換成數字類型 ( 注意不是 0) 3.可以使用 num ‘’ 將數字類型轉換成字符串類型 4.使用str.split(’’) 可以將字符串轉換成數組 5.使用arr.join(’’) 可以將數組轉換成字符串 6.JS中2的31次…