1 对象
1.1 定义
- 无序数据的集合
- 键值对的集合
1.2 写法
let obj = {'name' : 'frank', 'age' : 18}
let obj2 = new Object({'name' : 'frank', 'age' : 18})
console.log({'name' : 'frank', 'age' : 18}) // 匿名对象
不是对象
{foo : 'a'}
// 有一个代码块,里面有一个标签(lable) foo, foo 的内容为'a'
// 或 foo 是一个标签(lable),语句内容是 'a'
1.3 细节
- 对象的键名是字符串,不是标识符,可以包含任意字符
- 引号可以省略,但是省略之后只能按标识符的要求写
- 如果想用变量的值作为键名,要用[]括起来
对比:不加[]的属性名会自动变成字符串
加了[]则会被当做变量求值,如果值不是字符串,则会尝试变为字符串
let a = 'age'
错误写法:
let obj = {a : 18}
console.dir(obj) // Object { a : 18 }
正确写法
let obj = {[a] : 18}
console.dir(obj) // Object { age : 18 }
1.4 对象的隐藏属性
JS中每个对象都有一个隐藏属性,这个隐藏属性储存着这个对象共有属性组成的对象的地址,这个共有属性组成的对象即这个对象的原型
2 对象属性的增删改查
2.1 删
- 语法
delete obj.xxx 或 delete obj['xxx']
- 判断是否删除了该属性(''不能少!)
'xxx' in obj === false // true
- 注意 obj.xxx === undefined 不能判断'xxx'是否为obj的属性!!! 反例
let obj = {}
let obj2 = {xxx : undefined}
obj.xxx === undefined // true
obj2.xxx === undefined // true
如要判断:
'xxx' in obj && obj.xxx === undefined
2.2 查
- 语法
let obj = {'name' : 'frank', 'age' : 18}
查自身所有的keys
Object.keys(obj)
查自身所有的values
Object.values(obj)
查自身所有的keys、values
Object.entries(obj)
通过目录的形式查看自身的属性
console.dir(obj)
- 判断一个属性是自身属性还是原型链上的共有属性
let obj = {'name' : 'frank', 'age' : 18}
obj.hasOwnProperty('toString') // fasle
obj.hasOwnProperty('name') // true
- 两种方法查看对象的某个属性的值
中括号语法
obj['key']注意 obj[key] 是错误写法,不加 '' 的key是变量
点语法obj.key
2.3 加和修改
- 直接赋值
let obj = {'name' : 'frank', 'age' : 18}
改:
obj.name = 'xxx'
obj['name'] = 'xxx'
obj['na' + 'me'] = 'xxx'
或者
let key = 'name'
obj[key] = 'xxx'
- 批量赋值
Object.assign(obj,{'age' : 20, 'gender' : 'man'})
- 修改共有属性
- 无法直接通过自身修改或增加共有属性\
- 如果一定要修改或增加原型上的属性
obj.__proto__.toString = 'xxx' // 不推荐
Object.prototype.toString = 'xxx' // 推荐
- 修改原型
let obj = {'name' : 'frank', 'age' : 18}
let common = {'国籍' : '中国'}
obj.__proto__ = common // 不推荐
let obj2 = Object.create(common) // 一创建对象就指定原型 推荐
区别
let obj = Object.create({'name' : 'frank'}) // 该属性在原型上
let obj2 = new Object({'name' : 'frank'}) // 该属性在对象自身上
3 对象的创建
3.1 new X() 做了哪些事情?
- 首先自动创建一个新的空对象
- 然后将空对象的
__proto__指向构造函数的原型,原型地址指定为X.prototype - 自动将空对象作为this关键字运行构造函数
- 自动
return this
3.2 构造函数X
- X函数负责给对象本身添加属性
- X.prototype 负责保存对象的共有属性
3.3 代码规范
3.3.1 大小写
- 所有构造函数
首字母大写 - 所有被构造出来的对象,
首字母小写
3.3.2 词性
new后面的函数,使用名词形式,如new Object()- 其他函数,一般使用动词开头,如
createElement('div') - 声明一个函数f1,这个函数会自带一个prototype属性,里面有一constructor属性,constructor的值等于函数自身
f1.prototype.constructor === f1 // true