本文來(lái)自深入理解ES6
對(duì)象類別
普通對(duì)象: 具有js對(duì)象所有默認(rèn)內(nèi)部行為
特異對(duì)象: 具有某些與默認(rèn)行為不符的內(nèi)部行為
標(biāo)準(zhǔn)對(duì)象: ES6中規(guī)范定義的對(duì)象,Array,Date等
內(nèi)建對(duì)象: 腳本開(kāi)始執(zhí)行時(shí)存在于JS執(zhí)行環(huán)境中的對(duì)象兰伤,所有標(biāo)準(zhǔn)對(duì)象都是內(nèi)建對(duì)象
對(duì)象字面量的擴(kuò)展
1.屬性初始值和方法的簡(jiǎn)寫
屬性初始值的簡(jiǎn)寫簡(jiǎn)單來(lái)說(shuō)了讨,就是將對(duì)象屬性賦值時(shí)候一對(duì)一的鍵值對(duì)省略冒號(hào)和值捻激,只留下屬性名稱(鍵值對(duì)屬性名稱和函數(shù)參數(shù)相同情況下),屬性方法消除了冒號(hào)和function關(guān)鍵字前计。
// 屬性初始值簡(jiǎn)寫
function createPerson(name, age) {
return {
name,
age,
sayName() {
console.log(this.name)
}
}
}
2.可計(jì)算的屬性名
對(duì)象的屬性可以用點(diǎn)方法和[](方括號(hào))方式來(lái)表示胞谭,如果想要通過(guò)計(jì)算的到屬性名,需要用方括號(hào)代替點(diǎn)記法男杈。
let suffix = ' name'
let person = {
['first' + suffix] : 'nicholas',
['second' + suffix] : 'zakas'
}
console.log(person)
結(jié)果: {first name: "nicholas", second name: "zakas"}
console.log(person['first name'])
結(jié)果: nicholas
3. Object.is()方法
Object.is()方法判斷兩個(gè)值是否相等丈屹,用來(lái)彌補(bǔ)全等運(yùn)算符中的不準(zhǔn)確計(jì)算,該方法接受兩個(gè)參數(shù)势就,如果兩個(gè)參數(shù)類型相同泉瞻,且值也相同時(shí)脉漏,返回true
console.log(Object.is(+0 , -0)) //false
console.log(Object.is(5, '5')) //false
console.log(Object.is(true, 0)) //false
console.log(Object.is(true, '0')) //false
console.log(Object.is(NaN, NaN)) //true
Object.is()方法與==運(yùn)算符的唯一區(qū)別就是在于+0和-0被識(shí)別為不相等,NaN和NaN被認(rèn)定為相等袖牙。
4.Object.assign()方法
Object.assign()方法接受任意數(shù)量的源對(duì)象侧巨,并按制定的順序?qū)傩詮?fù)制到接收對(duì)象中,如果多個(gè)源對(duì)象具有相同的同名屬性鞭达,排位靠后的源對(duì)象會(huì)覆蓋排位靠前的屬性和方法司忱。
//派發(fā) Object.assign()
function EventTarget() {}
EventTarget.prototype = {
constructor: EventTarget, //構(gòu)造者
emit: function() {
console.log(arguments[0])
},//派發(fā)事件
on: function() {
console.log(arguments[0])
}
}
var myObject = {}
Object.assign(myObject, EventTarget.prototype);
myObject.emit('somethingChanged')
結(jié)果:somethingChanged
console.log(myObject)
結(jié)果:{constructor: ?, emit: ?, on: ?}
源對(duì)象覆蓋較前源對(duì)象屬性
let receiver = {};
Object.assign(receiver,
{
type: 'js',
name: 'file.js'
},
{
type: 'css'
}
)
console.log(receiver)
結(jié)果:VM867:12 {type: "css", name: "file.js"}
5.重復(fù)的對(duì)象字面量屬性
ES6去掉了同時(shí)出現(xiàn)多個(gè)同名屬性會(huì)拋出錯(cuò)誤這個(gè)現(xiàn)象,對(duì)于重復(fù)出現(xiàn)的屬性畴蹭,最后一個(gè)值會(huì)覆蓋最前面的值坦仍。
6.自由屬性枚舉順序
自有屬性的枚舉順序的基本規(guī)則是
1.所有的數(shù)字鍵按升序排序
2.所有的字符串按照他們被加入對(duì)象的順序排序
3.所有的symbol按照他們被加入對(duì)象的順序排序
7.增強(qiáng)對(duì)象原型
①改變對(duì)象的原型
正常情況下,Object.create()方法創(chuàng)建對(duì)象叨襟,原型是在對(duì)象創(chuàng)建時(shí)指定的繁扎,對(duì)象原型在實(shí)例化之后保持不變
Object.getPrototypeOf()方法返回指定對(duì)象的原型,Object.setPrototypeOf()方法改變?nèi)我庵赶蛑付▽?duì)象的原型糊闽,接受兩個(gè)是參數(shù)梳玫,被改變?cè)偷膶?duì)象及替代第一個(gè)參數(shù)原型的對(duì)象。
let person = {
getGretting() {
return 'hello';
}
}
let dog = {
getGretting() {
return 'woof'
}
}
let firend = Object.create(person)
console.log(firend.getGretting())
結(jié)果:VM930:13 hello
console.log(Object.is(Object.getPrototypeOf(firend), person))
結(jié)果:VM930:14 true
②簡(jiǎn)化原型范文Super引用
//Super對(duì)父類原型的訪問(wèn),在多重繼承中非常有用
let person1 = {
getGretting() {
return 'hello';
}
}
let dog1 = {
getGretting() {
return 'woof'
}
}
let firend1 = {
getGretting() {
return super.getGretting() + ',hi'
}
}
Object.setPrototypeOf(firend1, person1)
console.log(firend1.getGretting())
結(jié)果:hello,hi
console.log(Object.is(Object.getPrototypeOf(firend1), person1))
結(jié)果:true
Object.setPrototypeOf(firend1, dog1)
console.log(firend1.getGretting())
結(jié)果:woof,hi
console.log(Object.is(Object.getPrototypeOf(firend1), person1))
結(jié)果:false
console.log(Object.is(Object.getPrototypeOf(firend1), dog1))
結(jié)果: true