最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ES6 對(duì)象的新功能與解構(gòu)賦值介紹

 更新時(shí)間:2019年02月05日 15:32:48   作者:JennyTong  
這篇文章主要介紹了ES6 對(duì)象的新功能與解構(gòu)賦值介紹,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

ES6 通過(guò)字面量語(yǔ)法擴(kuò)展、新增方法、改進(jìn)原型等多種方式加強(qiáng)對(duì)象的使用,并通過(guò)解構(gòu)簡(jiǎn)化對(duì)象的數(shù)據(jù)提取過(guò)程。

一、字面量語(yǔ)法擴(kuò)展

在 ES6 模式下使用字面量創(chuàng)建對(duì)象更加簡(jiǎn)潔,對(duì)于對(duì)象屬性來(lái)說(shuō),屬性初始值可以簡(jiǎn)寫(xiě),并可以使用可計(jì)算的屬性名稱。對(duì)象方法的定義消除了冒號(hào)和 function 關(guān)鍵字,示例如下:

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

針對(duì)重復(fù)定義的對(duì)象字面量屬性,ES5嚴(yán)格模式下會(huì)進(jìn)行重復(fù)屬性檢查從而拋出錯(cuò)誤,而ES6移除了這個(gè)機(jī)制,無(wú)論嚴(yán)格模式還是非嚴(yán)格模式,同名屬性都會(huì)取最后一個(gè)值。

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

二、新增方法

從 ES5 開(kāi)始遵循的一個(gè)設(shè)計(jì)目標(biāo)是,避免創(chuàng)建新的全局函數(shù),也不在object.prototype上創(chuàng)建新的方法。

為了是某些任務(wù)更容易實(shí)現(xiàn),ES6 在全局 Object 對(duì)象上引入一些新的方法。

2.1 Object.is( )

ES6 引入Object.is()方法來(lái)彌補(bǔ)全等運(yùn)算符的不準(zhǔn)確計(jì)算。

全等運(yùn)算符在比較時(shí)不會(huì)觸發(fā)強(qiáng)制轉(zhuǎn)換類(lèi)型,Object.is()運(yùn)行結(jié)果也類(lèi)似,但對(duì)于 +0 和 -0(在 JS 引擎中為兩個(gè)不同實(shí)體)以及特殊值NaN的比較結(jié)果不同,示例來(lái)看:

// demo3
console.log(5 == '5') // true
console.log(5 === '5') // false
console.log(Object.is(5, '5')) // false

console.log(+0 == -0) // true
console.log(+0 === -0) // true
console.log(Object.is(+0, -0)) // false

console.log(NaN == NaN) // false
console.log(NaN === NaN) // false
console.log(Object.is(NaN, NaN)) // true

總結(jié)來(lái)說(shuō),Object.is()對(duì)所有值進(jìn)行了更嚴(yán)格等價(jià)判斷。當(dāng)然,是否使用Object.is()代替全等操作符(===)取決于這些特殊情況是否影響代碼。

2.2 Object.assign( )

ES6 添加Object.assign()來(lái)實(shí)現(xiàn)混合(Mixin)模式,即一個(gè)對(duì)象接收另一個(gè)對(duì)象的屬性和方法。注意是接收而不是繼承,例如接收 demo1 中的對(duì)象:

// demo4
var friend = {}
Object.assign(friend, person)
friend.sayName() // Jenny
console.log(friend.age) // 18
console.log(Object.getPrototypeOf(friend) === person) // false

在Object.assign()之前,許多 JS 庫(kù)自定義了混合方法 mixin( ) 來(lái)實(shí)現(xiàn)對(duì)象組合,代碼類(lèi)似于:

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

可以看出 mixin( ) 方法使用“=”賦值操作,并不能復(fù)制訪問(wèn)器屬性,同理Object.assign()也不能復(fù)制訪問(wèn)器屬性,只是執(zhí)行了賦值操作,訪問(wèn)器屬性最終會(huì)轉(zhuǎn)變?yōu)榻邮諏?duì)象的數(shù)據(jù)屬性。示例如下:

// demo5
var animal = {
 name: 'lili',
 get type () {
  return this.name + type
 },
 set type (news) {
  type = news
 }
}
animal.type = 'cat'
console.log(animal.type) // lilicat

var pet = {}
Object.assign(pet, animal)
console.log(animal) // { name: 'lili', type: [Getter/Setter] }
console.log(pet) // { name: 'lili', type: 'lilicat' }

2.3 Object.setPrototypeOf( )

正常情況下對(duì)通過(guò)構(gòu)造函數(shù)或Object.create()創(chuàng)建時(shí),原型是被指定的。ES6 添加Object.setPrototypeOf() 方法來(lái)改變對(duì)象的原型。

例如創(chuàng)建一個(gè)繼承 person 對(duì)象的 coder 對(duì)象,然后改變 coder 對(duì)象的原型:

// demo6
let person = {
 myname: 'Jenny',
 sayName () { 
  console.log(this.myname)
 }
}

// 創(chuàng)建原型為 person 的 coder 對(duì)象
let coder = Object.create(person) 
coder.sayName() // Jenny
console.log(Object.getPrototypeOf(coder) === person) // true

let hero = {
 myname: 'lee',
 sayName () {
  console.log(this.myname)
 }
}

// 改變 coder 對(duì)象的原型為 hero
Object.setPrototypeOf(coder, hero)
coder.sayName() // lee
console.log(Object.getPrototypeOf(coder) === hero) // true

對(duì)象原型被存儲(chǔ)在內(nèi)部專有屬性[[Prototype]],調(diào)用Object.getPrototypeOf()返回存儲(chǔ)在其中的值,調(diào)用Object.setPrototypeOf()改變其值。這個(gè)方法加強(qiáng)了對(duì)對(duì)象原型的操作,下一節(jié)重點(diǎn)講解其它操作原型的方式。

三、增強(qiáng)對(duì)象原型

原型是 JS 繼承的基礎(chǔ),ES6 針對(duì)原型做了很多改進(jìn),目的是更靈活地方式使用原型。除了新增的Object.setPrototypeOf()改變?cè)屯猓€引入Super關(guān)鍵字簡(jiǎn)化對(duì)原型的訪問(wèn),

3.1 Super關(guān)鍵字

ES6 引入Super來(lái)更便捷的訪問(wèn)對(duì)象原型,上一節(jié)介紹 ES5 可以使用Object.getPrototypeOf()返回對(duì)象原型。舉例說(shuō)明Super的便捷,當(dāng)對(duì)象需要復(fù)用原型方法,重新定義自己的方法時(shí),兩種實(shí)現(xiàn)方式如下:

// demo7
let coder1 = {
 getName () {
  console.log("coder1 name: ")
  Object.getPrototypeOf(this).sayName.call(this)
 }
}

// 設(shè)置 coder1 對(duì)象的原型為 hero(demo6)
Object.setPrototypeOf(coder1, hero)
coder1.getName() // coder1 name: lee

let coder2 = {
 getName () {
  console.log("coder2 name: ")
  super.sayName()
 }
}

Object.setPrototypeOf(coder2, hero)
coder2.getName() // coder2 name: lee

在 coder1 對(duì)象的 getName 方法還需要call(this)保證使用的是原型方法的 this,比較復(fù)雜,并且在多重繼承會(huì)出現(xiàn)遞歸調(diào)用棧溢出錯(cuò)誤,而直接使用Super就很簡(jiǎn)單安全。

注意必須在簡(jiǎn)寫(xiě)方法中使用Super,要不然會(huì)報(bào)錯(cuò),例如以下代碼運(yùn)行語(yǔ)法錯(cuò)誤:

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

因?yàn)樵诶又?getName 成為了匿名 function 定義的屬性,在當(dāng)前上下問(wèn)調(diào)用Super引用是非法的。如果不理解,可以進(jìn)一步看下方法的從屬對(duì)象。

3.2 方法的從屬對(duì)象

ES6 之前“方法”是具有功能而非數(shù)據(jù)的對(duì)象屬性,ES6 正式將方法定義為有 [[HomeObject]]內(nèi)部屬性的函數(shù)。

[[HomeObject]]屬性存儲(chǔ)當(dāng)前方法的從屬對(duì)象,例如:

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

function shareName () {
  console.log("No HomeObject")
}

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

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

四、解構(gòu)賦值

ES6 為數(shù)組和對(duì)象字面量提供了新特性——解構(gòu),可以簡(jiǎn)化數(shù)據(jù)提取的過(guò)程,減少同質(zhì)化的代碼。解構(gòu)的基本語(yǔ)法示例如下:

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

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

4.1 默認(rèn)值

如果解構(gòu)時(shí)變量名稱與對(duì)象屬性名不同,即在對(duì)象中不存在,那么這個(gè)變量會(huì)默認(rèn)為undefined:

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

4.2 非同名變量賦值

非同名變量的默認(rèn)值為undefined,但更多時(shí)候是需要為其賦值的,并且會(huì)將對(duì)象屬性值賦值給非同名變量。ES6 為此提供了擴(kuò)展語(yǔ)法,與對(duì)象字面量屬性初始化程序很像:

let user = {
 name: 'jenny',
 id: 18
}
let {name, id = 16, job = 'engineer'} = user
console.log(name, id, job) // jenny 18 engineer

let {name: localName, id: localId} = user
console.log(localName, localId) // jenny 18

let {name: otherName = 'lee', job: otherJob = 'teacher'} = user
console.log(otherName, otherJob) // jenny teacher

可以看出這種語(yǔ)法實(shí)際與對(duì)象字面量相反,賦值名在冒號(hào)左,變量名在右,并且解構(gòu)賦值時(shí),只是更新了默認(rèn)值,不能覆蓋對(duì)象原有的屬性值。

4.3 嵌套解構(gòu)

解構(gòu)嵌套對(duì)象的語(yǔ)法仍然類(lèi)似對(duì)象字面量,使用花括號(hào)繼續(xù)查找下層結(jié)構(gòu):

let user = {
 name: 'jenny',
 id: 18,
 desc: {
  pos: {
   lng: 111,
   lat: 333
  }
 }
}

let {desc: {pos}} = user
console.log(pos) // { lng: 111, lat: 333 }

let {desc: {pos: {lng}}} = user
console.log(lng) // 111

let {desc: {pos: {lng: longitude}}} = user
console.log(longitude) // 111

五、對(duì)象類(lèi)別

ES6 規(guī)范定義了對(duì)象的類(lèi)別,特別是針對(duì)瀏覽器這樣的執(zhí)行環(huán)境。

  • 普通(Ordinary)對(duì)象

具有 JS 對(duì)象所有的默認(rèn)內(nèi)部行為

  • 特異(Exotic)對(duì)象

具有某些與默認(rèn)行為不符的內(nèi)部行為

  • 標(biāo)準(zhǔn)(Standard)對(duì)象

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

  • 內(nèi)建對(duì)象

腳本開(kāi)始執(zhí)行時(shí)存在于 JS 執(zhí)行環(huán)境中的對(duì)象
所有標(biāo)準(zhǔn)對(duì)象都是內(nèi)建對(duì)象

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 微信小程序繪制圖片發(fā)送朋友圈

    微信小程序繪制圖片發(fā)送朋友圈

    這篇文章主要為大家詳細(xì)介紹了微信小程序繪制圖片發(fā)送朋友圈,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • JavaScript中如何計(jì)算字符串文本的寬度

    JavaScript中如何計(jì)算字符串文本的寬度

    這篇文章主要介紹了JavaScript中如何計(jì)算字符串文本的寬度問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • uniapp?h5如何獲取用戶地理位置信息(使用高德地圖)

    uniapp?h5如何獲取用戶地理位置信息(使用高德地圖)

    這篇文章主要給大家介紹了關(guān)于uniapp?h5如何獲取用戶地理位置信息的相關(guān)資料,文中主要使用高德地圖,這里主要講h5實(shí)現(xiàn)獲取地理位置信息并定位功能,需要的朋友可以參考下
    2023-08-08
  • 基于事件冒泡、事件捕獲和事件委托詳解

    基于事件冒泡、事件捕獲和事件委托詳解

    這篇文章主要介紹了事件冒泡、事件捕獲和事件委托,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 微信小程序?qū)崿F(xiàn)的一鍵撥號(hào)功能示例

    微信小程序?qū)崿F(xiàn)的一鍵撥號(hào)功能示例

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)的一鍵撥號(hào)功能,結(jié)合實(shí)例形式分析了微信小程序使用wx.makePhoneCall實(shí)現(xiàn)撥打電話功能相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • javascript eval()用法

    javascript eval()用法

    實(shí)例分析eval的一些使用方法與技巧。
    2009-03-03
  • javascript中創(chuàng)建對(duì)象的三種常用方法

    javascript中創(chuàng)建對(duì)象的三種常用方法

    在javascript中創(chuàng)建對(duì)象的三種方法,腳本之家以前發(fā)布過(guò)有簡(jiǎn)單實(shí)例版的,大家可以參考下。
    2010-12-12
  • javaScript中push函數(shù)用法實(shí)例分析

    javaScript中push函數(shù)用法實(shí)例分析

    這篇文章主要介紹了javaScript中push函數(shù)用法,較為詳細(xì)的分析了javascript中push函數(shù)的功能、定義及使用技巧,需要的朋友可以參考下
    2015-06-06
  • 原生JS實(shí)現(xiàn)音樂(lè)播放器的示例代碼

    原生JS實(shí)現(xiàn)音樂(lè)播放器的示例代碼

    這篇文章主要介紹了原生JS實(shí)現(xiàn)音樂(lè)播放器的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 微信小程序?qū)崿F(xiàn)列表的橫向滑動(dòng)方式

    微信小程序?qū)崿F(xiàn)列表的橫向滑動(dòng)方式

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)列表的橫向滑動(dòng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

芮城县| 大荔县| 屏山县| 龙井市| 彝良县| 广西| 淅川县| 龙岩市| 进贤县| 朝阳区| 彩票| 南涧| 和顺县| 屏南县| 宁城县| 香河县| 天峻县| 特克斯县| 南乐县| 南澳县| 泸定县| 彭泽县| 钟祥市| 马公市| 且末县| 巴中市| 海丰县| 太和县| 盐池县| 黄山市| 秀山| 聂拉木县| 肇东市| 加查县| 红安县| 舟山市| 错那县| 图木舒克市| 山阴县| 象州县| 噶尔县|