聲明對(duì)象的兩種語(yǔ)法
let obj = { 'name': 'kong', 'age': 22} // 簡(jiǎn)寫(xiě)
let obj = new Object({'name': 'kong'}) // 標(biāo)準(zhǔn)寫(xiě)法
如何刪除對(duì)象的屬性
delete
刪除屬性名和屬性值
delete obj.xxx
delete obj['xxx']
不含屬性名
'xxx' in obj === false
含屬性名但值為 undefined
'xxx' in obj && obj.xxx === undefined
obj.xxx = undefined 不能斷定 xxx 是否為 obj 的屬性胞四!
僅僅刪除屬性值
如何查看對(duì)象的屬性
查看自身所有屬性
Object.keys(obj)
查看自身+共有屬性
console.dir(obj)
判斷一個(gè)屬性是自身還是共有的
obj.hasOwnProperty('toString')
in
與 hasOwnProperty
區(qū)別
in
不能識(shí)別屬性是來(lái)自對(duì)象自身的還是來(lái)自原型。
var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true
hasOwnProperty
表示該對(duì)象自身是否具有該屬性氓侧。
var obj = {
p: 123
};
obj.hasOwnProperty('p') // true
obj.hasOwnProperty('toString') // false
讀取屬性的兩種寫(xiě)法
obj.key
obj['key']
注意 obj[key]
變量key值一般不為 'key'(坑人語(yǔ)法)
obj.name
// 等價(jià)于 obj['name']
let name = 'kong'
// obj[name] 等價(jià)于 obj['kong'] 而不是obj['name']和obj.name
如何修改或增加對(duì)象的屬性
- 直接賦值
let obj = {name: 'frank'} // name是字符串
obj.name = 'frank' // name字符串
obj['name'] = 'frank'
obj['na'+'me'] = 'frank'
let key = 'name'; obj[key] = 'frank'
obj[name] = 'frank' // 錯(cuò)誤寫(xiě)法约巷,因?yàn)閚ame的值不確定
let key = 'name';obj.key = 'frank' // 錯(cuò)誤寫(xiě)法。因?yàn)閛bj.key等價(jià)于obj['key']
- 批量賦值
Object.assign(obj, {age: 22, gender: 'man'})
-
修改或增加共有屬性
注:無(wú)法通過(guò)自身修改或增加共有屬性
let obj = {}, obj2 = {} // 共有 toString
obj.toString = 'xxx' // 只會(huì)在改 obj 自身屬性
obj2.toString // 還是在原型上
- 偏要修改或增加原型上的屬性
obj.__proto__.toString = 'xxx' // 不推薦用 __proto__
Object.prototype.toString = 'xxx'
// 不要修改原型踩麦,會(huì)引起很多問(wèn)題
- 修改隱藏屬性
不推薦使用proto
let obj = {name:'kong'}
let obj2 = {name: 'jerry'}
let common = {kind: 'human'}
obj.__proto__ = common
obj2.__proto__ = common
使用 Object.create
let obj = Object.create(common)
obj.name = 'frank'
let obj2 = Object.create(common)
obj2.name = 'jack'
// 要改就一開(kāi)始就改氓癌,別后來(lái)再改
對(duì)象的隱藏屬性
隱藏屬性
- JS每一個(gè)對(duì)象都有一個(gè)隱藏屬性
- 這個(gè)隱藏屬性存儲(chǔ)著其共有屬性組成的****對(duì)象的地址
- 這個(gè)共有屬性組成的對(duì)象叫做原型
- 隱藏屬性存儲(chǔ)著原型的地址
var obj = {}
obj.toString() //不報(bào)錯(cuò)
// 因?yàn)閛bj的隱藏屬性對(duì)應(yīng)的對(duì)象上有toString</pre>
原型
每個(gè)對(duì)象都有原型
- 原型里存著對(duì)象的共有屬性
- 比如obj的原型就是一個(gè)對(duì)象
-
obj.__proto__
存著這個(gè)對(duì)象的地址 - 這個(gè)對(duì)象里有
toString/constructor/valueOf
等屬性
對(duì)象的原型也是對(duì)象
- 所以對(duì)象的原型也有原型
-
obj = {}
的原型就是所有對(duì)象的原型 - 這個(gè)原型包含所有對(duì)象的共有屬性反粥,是對(duì)象的根
- 這個(gè)原型也有原型疲迂,原型就是 null