聲明對象的兩種語法
let obj = { 'name': 'kong', 'age': 22} // 簡寫
let obj = new Object({'name': 'kong'}) // 標準寫法
如何刪除對象的屬性
delete
刪除屬性名和屬性值
delete obj.xxx
delete obj['xxx']

image.png
不含屬性名
'xxx' in obj === false
含屬性名但值為 undefined
'xxx' in obj && obj.xxx === undefined
obj.xxx = undefined 不能斷定 xxx 是否為 obj 的屬性!
僅僅刪除屬性值

image.png
如何查看對象的屬性
查看自身所有屬性
Object.keys(obj)
查看自身+共有屬性
console.dir(obj)
判斷一個屬性是自身還是共有的
obj.hasOwnProperty('toString')
in 與 hasOwnProperty 區(qū)別
in不能識別屬性是來自對象自身的還是來自原型。
var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true
hasOwnProperty 表示該對象自身是否具有該屬性。
var obj = {
p: 123
};
obj.hasOwnProperty('p') // true
obj.hasOwnProperty('toString') // false
讀取屬性的兩種寫法
obj.key
obj['key']
注意 obj[key]變量key值一般不為 'key'(坑人語法)
obj.name
// 等價于 obj['name']
let name = 'kong'
// obj[name] 等價于 obj['kong'] 而不是obj['name']和obj.name
如何修改或增加對象的屬性
- 直接賦值
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' // 錯誤寫法,因為name的值不確定
let key = 'name';obj.key = 'frank' // 錯誤寫法。因為obj.key等價于obj['key']
- 批量賦值
Object.assign(obj, {age: 22, gender: 'man'})
-
修改或增加共有屬性
注:無法通過自身修改或增加共有屬性
let obj = {}, obj2 = {} // 共有 toString
obj.toString = 'xxx' // 只會在改 obj 自身屬性
obj2.toString // 還是在原型上
- 偏要修改或增加原型上的屬性
obj.__proto__.toString = 'xxx' // 不推薦用 __proto__
Object.prototype.toString = 'xxx'
// 不要修改原型,會引起很多問題
- 修改隱藏屬性
不推薦使用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'
// 要改就一開始就改,別后來再改
對象的隱藏屬性
隱藏屬性
- JS每一個對象都有一個隱藏屬性
- 這個隱藏屬性存儲著其共有屬性組成的****對象的地址
- 這個共有屬性組成的對象叫做原型
- 隱藏屬性存儲著原型的地址
var obj = {}
obj.toString() //不報錯
// 因為obj的隱藏屬性對應的對象上有toString</pre>

image.png
原型
每個對象都有原型
- 原型里存著對象的共有屬性
- 比如obj的原型就是一個對象
-
obj.__proto__存著這個對象的地址 - 這個對象里有
toString/constructor/valueOf等屬性

image.png
對象的原型也是對象
- 所以對象的原型也有原型
-
obj = {}的原型就是所有對象的原型 - 這個原型包含所有對象的共有屬性,是對象的根
- 這個原型也有原型,原型就是 null

image.png