对象基础
-
定义:
无序数据集合
键值对的集合
-
写法:
let obj={'name':'lemom', 'age':18} let obj = new Object({'name':'lemom' }) cosole.log({'name':'lemom', 'age':18}) -
细节
键名是字符串,不是标识符,可包含任意字符
引号可省略,省略后只能写标识符(引号省略了键名依然是字符串)
Object.keys(obj)可以得到obj的所有key
-
变量作属性名
let p1 = 'name' let obj={p1 : 'lemom'} //属性名为'p1' let obj={[p1] : 'lemom'} //属性名为'name'对比:不加 [ ] 的属性会自动变成字符串;加了[ ]则会当做变量求值,值不是字符串会自动变成字符串
对象的隐藏属性
-
JS中每个对象都有一个隐藏属性,存储着共有属性组成的对象的二地址
,这个组成的对象就叫做原型,也就是说隐藏属性存着原型的地址
-
示例
var obj={} obj.toString() //因为 obj的隐藏属性对应的对象上有toString(),所以该方法不会报错
对象的增删改查
删除属性
-
delete obj.xxx 或 delete obj['xxx']
区别:obj.xxx=undefined,此时只是删除属性值,delete则是删除属性名和属性值
-
判断属性名是否在对象中(不区分自身与共有属性)
'xxx' in obj 返回boolean
-
不能用 obj.xxx===undefined 来判断属性名是否存在,应该用( 'xxx' in obj && obj.xxx===undefined )
查看所有属性
-
查看自身所有属性
Object.keys(obj)
-
查看自身 和 共有属性
console.dir(obj)
-
判断一个属性是否是自身属性
obj.hasOwnProperty('toString')
-
两种方法查看属性值:
-
中括号:obj['key']
-
点语法:obj.key
注意:obj[key] key在此处为变量,表示的是字符串
obj.name !== obj[name]
obj.name === obj['name']
-
原型
- 每个对象都有原型,原型里存着对象的共有属性
- obj.__ proto __存着这个原型对象的地址
- 对象的原型也是对象,所以原型也有原型,包含着所有对象的共有属性,是对象的根
- 原型的原型是 null
修改或增加属性
-
直接赋值
let obj={name:'lemom'} obj.name='lemom2' obj['name']='lemom22' obj['na'+'me']='lemom222' let key = 'name' obj[key] = 'lemom223' -
批量赋值
Object.assign(obj,{age:18, gender:'male'})
无法通过自身属性修改原型属性
如:obj.toString = 'xxx' 只是修改自身属性,不会影响原型上的属性。
但可以通过以下方式修改或增加原型属性:
obj.__proto.toString='xxx' //但不推荐这种方式 Object.prototype.toString='xxx' //推荐此方式一般不要修改原型
-
修改隐藏属性(原型)( __ proto __)
let obj = {name:'lemom'} let common ={kind:'human'} obj.__proto__ = common推荐使用 Object.create() 方法
let common ={kind:'human'} let obj = Object.create(common) obj.name='lemom' //先修改原型,再添加自身属性