2020-08-14 26課 JS對象

聲明對象的兩種語法

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')

inhasOwnProperty 區(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'
// 要改就一開始就改,別后來再改

對象的隱藏屬性

隱藏屬性

  1. JS每一個對象都有一個隱藏屬性
  2. 這個隱藏屬性存儲著其共有屬性組成的****對象的地址
  3. 這個共有屬性組成的對象叫做原型
  4. 隱藏屬性存儲著原型的地址
var obj = {}
obj.toString()  //不報錯
 // 因為obj的隱藏屬性對應的對象上有toString</pre>
image.png

原型

每個對象都有原型

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

對象的原型也是對象

  1. 所以對象的原型也有原型
  2. obj = {} 的原型就是所有對象的原型
  3. 這個原型包含所有對象的共有屬性,是對象的根
  4. 這個原型也有原型,原型就是 null

image.png

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容