Es6對(duì)象的擴(kuò)展

屬性的簡(jiǎn)寫方法

var name = '秦司令';
var json = {name} // name:'秦司令'

上面代碼中,變量在對(duì)象中當(dāng)做屬性名,屬性值就是變量的值,這就是屬性的簡(jiǎn)寫方式芹关。


var age = 19
var obj = {
   name:'秦司令',  
   age
}
console.log(obj) // {name:'秦司令',age:19}

函數(shù)中的聲明的對(duì)象也能簡(jiǎn)寫

function example(x,y){
  return {x,y}
}
console.log(example(1,2)) // {x:1,y:2} 

上面代碼如果不傳參,x和y的參數(shù)就是undefined。


對(duì)象里面的函數(shù)也可以簡(jiǎn)寫伊履。

var json = {
  add(){
    alert(1)
  }
}
// 上面的方法等同于下面
var json = {
  add:function(){
    alert(1)
  }
}

簡(jiǎn)寫一個(gè)Generator函數(shù),前面需要要加上 * 號(hào)

var obj = {
    * add(){
      yiled 'hello word'
    }
}

上面代碼中,Generator函數(shù)等下一期跟你們分享,詳細(xì)講解。

屬性名表達(dá)式

js定義對(duì)象有兩種方式

var obj = {}
obj.name = '秦司令';
obj['a' + 'ge'] = 19;

上面代碼中,方法一是用標(biāo)識(shí)符作為對(duì)象屬性名,方法二是用表達(dá)式作為屬性名,這是將表達(dá)式方在中括號(hào)內(nèi),中括號(hào)內(nèi)可以寫變量,請(qǐng)看下面代碼酣栈。

let age = 'age';
var json = {
  [age] :19,
  ['a' + 'bc'] : 123
}
console.log(json) // {age:19,abc:123}

表達(dá)式還可以用于定義方法名透且。

var obj = {
    ['a' + 'bc'](){
        return 'abc'
    }
}
console.log(obj.abc()) // abc

注意,對(duì)象的簡(jiǎn)寫不能和表達(dá)式一起使用,會(huì)報(bào)錯(cuò)。

var name = '秦司令';
console.log({ [name] }) // 報(bào)錯(cuò)
console.log({ [name] : 123 }) // 秦司令:123

如果屬性表達(dá)式是一個(gè)對(duì)象的話,默認(rèn)情況下會(huì)自動(dòng)轉(zhuǎn)為字符串,[object Object] 窿吩。

var dx = {}
var json = {
  [dx]:123
}
console.log(json) // {[object Object] :123}

方法name的屬性

函數(shù)的name屬性,返回函數(shù)名,對(duì)象方法也是函數(shù),因此也有name屬性。

var obj = {
  add(){
    return 123
  }
}
console.log(obj.add.name) // add

上面代碼,方法add的name屬性就是函數(shù)名,add错览。


函數(shù)name屬性有兩種特殊情況,bind方法創(chuàng)造的函數(shù),name屬性返回 bound 加上函數(shù)名 ;Function 構(gòu)造函數(shù)創(chuàng)造的函數(shù),name屬性返回anonymous 英語(yǔ)意思為(匿名的)

(new Function()).name // anonymous
function abc(){}
console.log(abc.bind().name) // bound abc 

如果對(duì)象方法是一個(gè)Symbol值,那么name屬性返回的就是這個(gè)Symbol值的描述纫雁。

var s = Symbol('foo')
var s1 = Symbol()
let obj = {
  [s](){},
  [s1](){}
}
console.log(obj[s].name) // ['foo']
console.log(obj[s1].name) // ""

上面代碼中,s對(duì)應(yīng)的Symbol值有描述,s1沒有

屬性的可枚舉性和遍歷

可枚舉性

對(duì)象的每個(gè)屬性都有一個(gè)描述對(duì)象(Descriptor),用來(lái)控制該屬性的行為。
Object.getOwnPropertyDescriptor方法可以獲取該屬性的描述對(duì)象倾哺。

let obj = {foo:123};
Object.getOwnPropertyDescriptor(obj,'foo');
//  {
//    value: 123,
//    writable: true,
//    enumerable: true,
//    configurable: true
//  }

描述對(duì)象的enumerable屬性稱為 "可枚舉性" , 如果該屬性為false,就表示某些操作會(huì)忽略當(dāng)前屬性轧邪。


目前,有四種操作會(huì)忽略enumerable為false屬性
for..in循環(huán):只遍歷對(duì)象自身和繼承的可枚舉性的屬性
Object.keys() : 返回對(duì)象自身的所有可枚舉屬性的鍵名
JSON.stringify() : 只轉(zhuǎn)換自身的可枚舉性的屬性
Object.assign() : 忽略enumerable為false的屬性,只拷貝對(duì)象自身的可枚舉性的屬性

var json1 = {name:'秦司令'}
Object.defineProperty(json1,'age',{
    value:19,
    enumeable:false
})
for(var i in json1){
    console.log(i)   // name 
};
console.log(Object.keys(json1)) // ['name']
console.log(JSON.stringify(json1))  // {"name":"秦司令"}
console.log(Object.assign({},json1))  // {name: "秦司令"}

上面代碼中,都獲取不到enumerable為false的屬性,Object.defineProperty是專門設(shè)置描述對(duì)象的屬性;

屬性的遍歷
Object.getOwnPropertyNames(obj)

該方法返回一個(gè)數(shù)組,包含自身的所有屬性(不包含Symbol屬性,但是包括不可枚舉屬性)的鍵名

var json1 = {name:'秦司令'}
Object.defineProperty(json1,'age',{
    value:19,
    enumeable:false
})
console.log(Object.getOwnPropertyNames(json1)) // ["name", "age"]
Object.getOwnPropertySymbols(obj)

該方法返回一個(gè)數(shù)組,包含對(duì)象自身的所有 Symbol 屬性的鍵名,只返回Symbol的鍵名羞海。

var jsonArr = {[Symbol('123')]:1,b:2,c:9,3:'d',[Symbol()]:123}
console.log(Object.getOwnPropertySymbols(jsonArr)) //  [Symbol(123), Symbol()]
Reflect.ownKeys(obj)

該方法返回一個(gè)數(shù)組忌愚,包含對(duì)象自身的所有鍵名,不管鍵名是 Symbol 或字符串却邓,也不管是否可枚舉硕糊。

var jsonArr = {[Symbol('123')]:1,b:2,c:9,3:'d',[Symbol()]:123}
console.log(Reflect.ownKeys(jsonArr)) // ["3", "b", "c", Symbol()]

上面代碼中,Reflect.ownKeys該方法返回一個(gè)數(shù)組,返回所有的屬性,這個(gè)數(shù)組的順序是這樣的,首先是數(shù)值屬性,然后是字符串,按照字符串的位置加入,最后是Symbol屬性

super關(guān)鍵字

Object.prototype.name = 'lider'
var json = {
    name:'我是json',
    add(){
        return super.name;
    }
}
console.log(json.add());

上面代碼中,super該方法是指向Object的原型。


看下面的列子

var obj = {
    name:'我是obj',
    na(){
          console.log(this.name)
    }
}

var json = {
    name:'我是json',
    add(){
        return super.name;
    }
}

Object.setPrototypeOf(json,obj)
console.log(json.add()); // 我是obj

上面的代碼,把json的原型改成了obj的原型,所以name屬性就指向obj里面的。


super該方法現(xiàn)正只能,用在對(duì)象的簡(jiǎn)寫方法內(nèi)容癌幕。

// 報(bào)錯(cuò)
const obj = {
  foo: super.foo
}

// 報(bào)錯(cuò)
const obj = {
  foo: () => super.foo
}

// 報(bào)錯(cuò)
const obj = {
  foo: function () {
    return super.foo
  }
}

對(duì)象的擴(kuò)展運(yùn)算符

Es2018將擴(kuò)展運(yùn)算符引入了對(duì)象衙耕。

var [a...b] = [1,2,3]
a //1
b // 2 3 

解構(gòu)賦值

對(duì)象的解構(gòu)賦值用于從一個(gè)對(duì)象取值,相當(dāng)于將目標(biāo)對(duì)象自身所有可遍歷屬性(包括enumerable),但尚未被讀取的屬性,分配到指定的對(duì)象上面,所有的鍵和它們的值,都會(huì)拷貝到新對(duì)象上面昧穿。

let {x,y...z} = {x:1,y:2,c:3,d:4}
x // 1
y // 2
z // {c:3,d:4}

上面代碼中,變量z是解構(gòu)賦值所在的對(duì)象,它獲取等號(hào)右邊尚未讀取的值,并且將(鍵值和屬性值) 一同拷貝過(guò)來(lái)


解構(gòu)賦值要求等號(hào)右邊必須是對(duì)象,如果不是對(duì)象,就會(huì)強(qiáng)制轉(zhuǎn)換為對(duì)象,undefined和null無(wú)法轉(zhuǎn)換為對(duì)象,所以它們會(huì)報(bào)錯(cuò)勺远。

let {...z} = null;
let {...a} = undefined

解構(gòu)賦值必須最后一個(gè)參數(shù)是擴(kuò)展運(yùn)算符,否則會(huì)報(bào)錯(cuò)。

let {...a,b} = {a:1,b:2}

注意,解構(gòu)賦值的拷貝是淺拷貝,即如果一個(gè)鍵值的是數(shù)組或者是對(duì)象,那么解構(gòu)賦值拷貝的是這個(gè)值的引用,而不是這個(gè)值的副本时鸵。

let obj = { a: { b: 1 } };
let { ...x } = obj;
obj.a.b = 2;
x.a.b // 2

另外,擴(kuò)展運(yùn)算符的解構(gòu)賦值,不能復(fù)制繼承的原型胶逢。

let o1 = { a: 1 };
let o2 = { b: 2 };
o2.__proto__ = o1;
let { ...o3 } = o2;
o3 // { b: 2 }
o3.a // undefined

如果擴(kuò)展運(yùn)算符后面是一個(gè)對(duì)象,則沒有任何效果。

console.log( {...{} , a:123 } ) // {a:123}

如果擴(kuò)展運(yùn)算符后面不是對(duì)象,則會(huì)自動(dòng)將其轉(zhuǎn)為對(duì)象饰潜。

console.log({...1}) // {}

上面代碼中,將其轉(zhuǎn)換為對(duì)象 包裝類Number{1} ,因此它沒有屬性則返回空對(duì)象初坠。


如果擴(kuò)展運(yùn)算符后面是字符串,它會(huì)自動(dòng)轉(zhuǎn)成一個(gè)類似數(shù)組的對(duì)象彭雾,因此返回的不是空對(duì)象碟刺。

{...'hello'}
// {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}

擴(kuò)展運(yùn)算符的參數(shù)之中,如有取值函數(shù)get,這個(gè)函數(shù)是會(huì)執(zhí)行的。

let abc = {
    get aa(){
        return 1
    }
}
console.log(abc)

let abc1 = {
    ...{
        get aa(){
            return '我自動(dòng)執(zhí)行'
        }
    }
}
console.log(abc1)
希望看完這篇文章,能對(duì)你有所收獲!
如有不正確的地方,望大神指點(diǎn)薯酝。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末半沽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吴菠,更是在濱河造成了極大的恐慌者填,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件做葵,死亡現(xiàn)場(chǎng)離奇詭異占哟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)酿矢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門榨乎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瘫筐,你說(shuō)我怎么就攤上這事蜜暑。” “怎么了严肪?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵史煎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我驳糯,道長(zhǎng)篇梭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任酝枢,我火速辦了婚禮恬偷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帘睦。我一直安慰自己袍患,他們只是感情好坦康,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诡延,像睡著了一般滞欠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肆良,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天筛璧,我揣著相機(jī)與錄音,去河邊找鬼惹恃。 笑死夭谤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巫糙。 我是一名探鬼主播朗儒,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼参淹!你這毒婦竟也來(lái)了醉锄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤承二,失蹤者是張志新(化名)和其女友劉穎榆鼠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亥鸠,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妆够,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了负蚊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片神妹。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖家妆,靈堂內(nèi)的尸體忽然破棺而出鸵荠,到底是詐尸還是另有隱情,我是刑警寧澤伤极,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布蛹找,位于F島的核電站,受9級(jí)特大地震影響哨坪,放射性物質(zhì)發(fā)生泄漏庸疾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一当编、第九天 我趴在偏房一處隱蔽的房頂上張望届慈。 院中可真熱鬧,春花似錦、人聲如沸金顿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)揍拆。三九已至渠概,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間礁凡,已是汗流浹背高氮。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顷牌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓塞淹,卻偏偏與公主長(zhǎng)得像窟蓝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饱普,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. 屬性的簡(jiǎn)介表示法 varfoo ='bar'; varbaz = {foo}; baz//{foo: "ba...
    ningluo閱讀 290評(píng)論 0 0
  • 屬性的簡(jiǎn)潔表示法 ES6允許直接寫入變量和函數(shù)运挫,作為對(duì)象的屬性和方法。 上面代碼表明套耕,ES6允許在對(duì)象之中谁帕,直接寫...
    oWSQo閱讀 509評(píng)論 0 0
  • 1.屬性的簡(jiǎn)潔表示法 允許直接寫入變量和函數(shù) 上面代碼表明,ES6 允許在對(duì)象之中冯袍,直接寫變量匈挖。這時(shí),屬性名為變量...
    雨飛飛雨閱讀 1,135評(píng)論 0 3
  • 1.屬性的簡(jiǎn)介表示法 const foo ='bar' const baz = {foo} baz //{foo:...
    yfsola閱讀 231評(píng)論 0 0
  • 江湖的另一端康愤,曾在鄱陽(yáng)湖上喝酒縱歌的年輕小哥劉休范初長(zhǎng)成儡循。 劉休范是孝武帝之侄,但他貌似資質(zhì)愚鈍征冷,從小就在長(zhǎng)輩兄弟...
    惘然生煙閱讀 693評(píng)論 0 4