亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

ES6 對象的新功能與解構賦值介紹

2024-05-06 16:47:59
字體:
來源:轉載
供稿:網友

ES6 通過字面量語法擴展、新增方法、改進原型等多種方式加強對象的使用,并通過解構簡化對象的數據提取過程。

一、字面量語法擴展

在 ES6 模式下使用字面量創建對象更加簡潔,對于對象屬性來說,屬性初始值可以簡寫,并可以使用可計算的屬性名稱。對象方法的定義消除了冒號和 function 關鍵字,示例如下:

// Demo1var value = "name", age = 18var person = { age, // age: age ['my' + value]: 'Jenny', // myname sayName () { // sayName: function()  console.log(this.myname) }}console.log(person.age) // 18console.log(person.myname) // Jennyperson.sayName(); // Jenny

針對重復定義的對象字面量屬性,ES5嚴格模式下會進行重復屬性檢查從而拋出錯誤,而ES6移除了這個機制,無論嚴格模式還是非嚴格模式,同名屬性都會取最后一個值。

// demo2var person = { ['my' + value]: 'Jenny', myname: 'Tom', myname: 'Lee',}console.log(person.myname) // Lee

二、新增方法

從 ES5 開始遵循的一個設計目標是,避免創建新的全局函數,也不在object.prototype上創建新的方法。

為了是某些任務更容易實現,ES6 在全局 Object 對象上引入一些新的方法。

2.1 Object.is( )

ES6 引入Object.is()方法來彌補全等運算符的不準確計算。

全等運算符在比較時不會觸發強制轉換類型,Object.is()運行結果也類似,但對于 +0 和 -0(在 JS 引擎中為兩個不同實體)以及特殊值NaN的比較結果不同,示例來看:

// demo3console.log(5 == '5') // trueconsole.log(5 === '5') // falseconsole.log(Object.is(5, '5')) // falseconsole.log(+0 == -0) // trueconsole.log(+0 === -0) // trueconsole.log(Object.is(+0, -0)) // falseconsole.log(NaN == NaN) // falseconsole.log(NaN === NaN) // falseconsole.log(Object.is(NaN, NaN)) // true

總結來說,Object.is()對所有值進行了更嚴格等價判斷。當然,是否使用Object.is()代替全等操作符(===)取決于這些特殊情況是否影響代碼。

2.2 Object.assign( )

ES6 添加Object.assign()來實現混合(Mixin)模式,即一個對象接收另一個對象的屬性和方法。注意是接收而不是繼承,例如接收 demo1 中的對象:

// demo4var friend = {}Object.assign(friend, person)friend.sayName() // Jennyconsole.log(friend.age) // 18console.log(Object.getPrototypeOf(friend) === person) // false

在Object.assign()之前,許多 JS 庫自定義了混合方法 mixin( ) 來實現對象組合,代碼類似于:

function mixin(receiver, supplier) { Object.keys(supplier).forEach(function (key) {  receiver[key] = supplier[key] }) return receiver}

可以看出 mixin( ) 方法使用“=”賦值操作,并不能復制訪問器屬性,同理Object.assign()也不能復制訪問器屬性,只是執行了賦值操作,訪問器屬性最終會轉變為接收對象的數據屬性。示例如下:

// demo5var animal = { name: 'lili', get type () {  return this.name + type }, set type (news) {  type = news }}animal.type = 'cat'console.log(animal.type) // lilicatvar pet = {}Object.assign(pet, animal)console.log(animal) // { name: 'lili', type: [Getter/Setter] }console.log(pet) // { name: 'lili', type: 'lilicat' }

2.3 Object.setPrototypeOf( )

正常情況下對通過構造函數或Object.create()創建時,原型是被指定的。ES6 添加Object.setPrototypeOf() 方法來改變對象的原型。

例如創建一個繼承 person 對象的 coder 對象,然后改變 coder 對象的原型:

// demo6let person = { myname: 'Jenny', sayName () {   console.log(this.myname) }}// 創建原型為 person 的 coder 對象let coder = Object.create(person) coder.sayName() // Jennyconsole.log(Object.getPrototypeOf(coder) === person) // truelet hero = { myname: 'lee', sayName () {  console.log(this.myname) }}// 改變 coder 對象的原型為 heroObject.setPrototypeOf(coder, hero)coder.sayName() // leeconsole.log(Object.getPrototypeOf(coder) === hero) // true

對象原型被存儲在內部專有屬性[[Prototype]],調用Object.getPrototypeOf()返回存儲在其中的值,調用Object.setPrototypeOf()改變其值。這個方法加強了對對象原型的操作,下一節重點講解其它操作原型的方式。

三、增強對象原型

原型是 JS 繼承的基礎,ES6 針對原型做了很多改進,目的是更靈活地方式使用原型。除了新增的Object.setPrototypeOf()改變原型外,還引入Super關鍵字簡化對原型的訪問,

3.1 Super關鍵字

ES6 引入Super來更便捷的訪問對象原型,上一節介紹 ES5 可以使用Object.getPrototypeOf()返回對象原型。舉例說明Super的便捷,當對象需要復用原型方法,重新定義自己的方法時,兩種實現方式如下:

// demo7let coder1 = { getName () {  console.log("coder1 name: ")  Object.getPrototypeOf(this).sayName.call(this) }}// 設置 coder1 對象的原型為 hero(demo6)Object.setPrototypeOf(coder1, hero)coder1.getName() // coder1 name: leelet coder2 = { getName () {  console.log("coder2 name: ")  super.sayName() }}Object.setPrototypeOf(coder2, hero)coder2.getName() // coder2 name: lee

在 coder1 對象的 getName 方法還需要call(this)保證使用的是原型方法的 this,比較復雜,并且在多重繼承會出現遞歸調用棧溢出錯誤,而直接使用Super就很簡單安全。

注意必須在簡寫方法中使用Super,要不然會報錯,例如以下代碼運行語法錯誤:

let coder4= { getName: function () { // getName () 正確  super.sayName() // SyntaxError: 'super' keyword unexpected here }

因為在例子中 getName 成為了匿名 function 定義的屬性,在當前上下問調用Super引用是非法的。如果不理解,可以進一步看下方法的從屬對象。

3.2 方法的從屬對象

ES6 之前“方法”是具有功能而非數據的對象屬性,ES6 正式將方法定義為有 [[HomeObject]]內部屬性的函數。

[[HomeObject]]屬性存儲當前方法的從屬對象,例如:

let coder5 = { sayName () {  console.log("I have HomeObject") }}function shareName () {  console.log("No HomeObject")}

coder5 對象的 sayName( ) 方法的[[HomeObject]]屬性值為 coder5,而 function 定義的 shareName( ) 沒有將其賦值給對象,所以沒有定義其[[HomeObject]]屬性,這在使用Super時很重要。

Super就是在[[HomeObject]]屬性上調用Object.getPrototypeOf()獲得原型的引用,然后搜索原型得到同名函數,最后設置 this 綁定調用相應方法。

四、解構賦值

ES6 為數組和對象字面量提供了新特性——解構,可以簡化數據提取的過程,減少同質化的代碼。解構的基本語法示例如下:

let user = { name: 'jenny', id: 18}let {name, id} = userconsole.log(name, id) // jenny 18

注意在這段代碼中,user.name 存儲在與對象屬性名同名的 name 變量中。

4.1 默認值

如果解構時變量名稱與對象屬性名不同,即在對象中不存在,那么這個變量會默認為undefined:

let user = { name: 'jenny', id: 18}let {name, id, job} = userconsole.log(name, id, job) // jenny 18 undefined

4.2 非同名變量賦值

非同名變量的默認值為undefined,但更多時候是需要為其賦值的,并且會將對象屬性值賦值給非同名變量。ES6 為此提供了擴展語法,與對象字面量屬性初始化程序很像:

let user = { name: 'jenny', id: 18}let {name, id = 16, job = 'engineer'} = userconsole.log(name, id, job) // jenny 18 engineerlet {name: localName, id: localId} = userconsole.log(localName, localId) // jenny 18let {name: otherName = 'lee', job: otherJob = 'teacher'} = userconsole.log(otherName, otherJob) // jenny teacher

可以看出這種語法實際與對象字面量相反,賦值名在冒號左,變量名在右,并且解構賦值時,只是更新了默認值,不能覆蓋對象原有的屬性值。

4.3 嵌套解構

解構嵌套對象的語法仍然類似對象字面量,使用花括號繼續查找下層結構:

let user = { name: 'jenny', id: 18, desc: {  pos: {   lng: 111,   lat: 333  } }}let {desc: {pos}} = userconsole.log(pos) // { lng: 111, lat: 333 }let {desc: {pos: {lng}}} = userconsole.log(lng) // 111let {desc: {pos: {lng: longitude}}} = userconsole.log(longitude) // 111

五、對象類別

ES6 規范定義了對象的類別,特別是針對瀏覽器這樣的執行環境。

  • 普通(Ordinary)對象

具有 JS 對象所有的默認內部行為

  • 特異(Exotic)對象

具有某些與默認行為不符的內部行為

  • 標準(Standard)對象

ES6 規范中定義的對象
可以是普通對象或特異對象,例如 Date、Array 等

  • 內建對象

腳本開始執行時存在于 JS 執行環境中的對象
所有標準對象都是內建對象

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美中文在线视频| 性欧美xxxx| www.亚洲男人天堂| 亚洲精选中文字幕| 成人欧美一区二区三区黑人| 最近2019年中文视频免费在线观看| 国产精品jizz在线观看麻豆| 美女视频久久黄| 亚洲高清一二三区| 欧美性猛交xxxx久久久| 欧美乱大交做爰xxxⅹ性3| xvideos国产精品| 欧美一区二区三区图| 久久不射电影网| 91久久久久久久久久久久久| 国产91免费看片| 亚洲精品综合久久中文字幕| 中文字幕亚洲国产| 久久99久久亚洲国产| 欧美壮男野外gaytube| 亚洲性夜色噜噜噜7777| 亚洲女人被黑人巨大进入al| 中文字幕av日韩| 九九热这里只有在线精品视| 日韩精品一二三四区| 欧美性猛交xxxx| 4p变态网欧美系列| 久久久久亚洲精品成人网小说| 亚洲综合日韩在线| 日韩中文字幕第一页| 国产成一区二区| 在线观看不卡av| 91免费在线视频网站| 国产日本欧美一区二区三区| 久久精品国产视频| 久久深夜福利免费观看| 欧美性受xxxx黑人猛交| 久久精品国产亚洲| 亚洲综合中文字幕在线| 欧美激情手机在线视频| 欧美亚洲国产成人精品| 欧美伊久线香蕉线新在线| 亚洲乱亚洲乱妇无码| 在线观看亚洲区| 欧美日韩久久久久| 久久久亚洲影院你懂的| 亚洲第一天堂无码专区| 中文字幕亚洲无线码a| 一本色道久久88精品综合| 亚洲精品免费在线视频| 国产欧美精品一区二区三区介绍| 精品动漫一区二区三区| 国产69久久精品成人| 亚洲天堂第一页| 欧美激情欧美狂野欧美精品| 亚洲天堂男人的天堂| 色偷偷噜噜噜亚洲男人| 亚洲综合中文字幕在线观看| 日韩精品视频观看| 欧美成人精品一区二区| 欧美国产中文字幕| 91视频-88av| 久久人人爽亚洲精品天堂| 亚洲午夜国产成人av电影男同| 最近中文字幕mv在线一区二区三区四区| 日韩欧美一区二区三区| 亚洲欧美在线免费| 日韩国产高清视频在线| 亚洲国产黄色片| 久久久综合av| 91精品国产自产在线| 欧美自拍视频在线| 国产精品老女人视频| 欧美激情久久久久久| 91精品国产成人www| 欧美一级bbbbb性bbbb喷潮片| 国产精品久久久久久久天堂| 国产有码在线一区二区视频| 亚洲午夜av电影| 久久躁狠狠躁夜夜爽| 国内精品伊人久久| 国产欧美一区二区三区久久人妖| 国产高清在线不卡| 欧美精品videosex性欧美| 亚洲综合一区二区不卡| 美乳少妇欧美精品| 欧美成人午夜激情| 久久久伊人欧美| 亚洲欧美中文在线视频| 成人黄色短视频在线观看| 日韩免费在线免费观看| 欧美日韩综合视频| 日韩精品久久久久久久玫瑰园| 亚洲一二三在线| 欧美视频在线观看免费| 日韩在线观看免费av| 国产亚洲人成网站在线观看| 91免费的视频在线播放| 日韩av电影中文字幕| 国产精品极品美女在线观看免费| 欧美一区亚洲一区| 欧美日韩国产成人| 久久琪琪电影院| 97人人爽人人喊人人模波多| 尤物tv国产一区| 亚洲国产精品字幕| 一区二区欧美久久| 国产精品观看在线亚洲人成网| 久久久久久久999| 国产成人精品亚洲精品| 大胆人体色综合| 91精品国产电影| 国产97色在线| 色黄久久久久久| 欧美精品一区三区| 国产精品一区二区av影院萌芽| 91日韩在线播放| 日韩av色综合| 日韩精品福利在线| 亚洲第一在线视频| 久久资源免费视频| 亚洲在线第一页| 欧美激情18p| 国产69精品久久久久久| 亚洲专区中文字幕| 欧美视频国产精品| 国产主播在线一区| 亚洲免费av网址| 在线播放亚洲激情| 国产精品av电影| 日韩网站免费观看高清| 精品国产999| 精品久久久久久中文字幕一区奶水| 久久国产精品偷| 国产精品成人免费视频| 欧美成人中文字幕在线| 久久久久久一区二区三区| 精品少妇一区二区30p| 久久亚洲精品毛片| 最近2019中文字幕大全第二页| 亚洲成成品网站| 欧美裸体xxxxx| 国产成人91久久精品| 国产日本欧美一区二区三区| 深夜福利91大全| 日韩中文字幕在线视频播放| 欧美亚洲免费电影| 日韩美女在线播放| 精品国产31久久久久久| 精品性高朝久久久久久久| 精品国产欧美一区二区五十路| 国产九九精品视频| 亚洲日本欧美中文幕| 成人免费观看a| 欧美激情视频免费观看| 欧洲美女7788成人免费视频| 美女啪啪无遮挡免费久久网站| 国产成人精品a视频一区www| 日韩小视频网址| 欧美日韩国产成人高清视频| 久久91精品国产91久久久| 久久天天躁狠狠躁夜夜爽蜜月| 久久久国产精品x99av| 国产精品一区二区电影|