1. JS对象
- JS对象的定义:无序的数据集合;键值对的集合。
- 写法:
// 第一种写法
let obj = {
'name' : 'Tony' , 'age' : 18
}
// 第二种写法
let obj = new Object ({
'name' : 'Tony' , 'age' : 18
})
// 第三种写法,这种写法不加console.log的话,他只是一个label标签,不是对象
console.log({
'name' : 'Tony' , 'age' : 18
})
- 注意:键名/属性名 是String,不是标识符,它可以包含任何字符
let obj = {
2 : '222'
}
Object.keys(obj)
//['2']
let a = 'xxx'
let obj = {
a : 'yyy'
}
// a === 'xxx'
/*
obj
{a: "yyy"}
*/
// 其中 a = 'xxx' 的 a 是变量
// obj 中的 a 是 string
let obj = {
1e2 : '一百'
}
/*
obj
{100: "一百"}
*/
当我们想让键名是变量时,可以使用 []
let a = 1
let obj = {
[a] : 'a是1'
}
/*
obj
{1: "a是1"}
Object.keys(obj)
["1"]
*/
2. 声明对象的两种语法
- let
let 声明 规则
声明的使用范围不能超过{}
{} 中不能重复声明
可以赋值,也可以不赋值
必须先声明再使用
全局声明的let, 不会变成window的属性
配合for循环循环时有奇效
例如
for (let i = 0 ; i < 5 ; i++){
setTimeout(() => {
console.log(i)
})
}
复制代码在使用 var 时,会返回 5 个 5
使用let时, 则会返回 0 1 2 3 4
- const
const声明规则
与 let 相同,但 const 赋值时就必须声明
3. 对象的删除
- delete
let obj = {
'name' : 'tony', 'age' : 18
}
delete obj.name
- undefined
这种方法只会删除属性值,不会删除属性名
let obj = {
'name' : 'tony', 'age' : 18
}
obj['name'] = undefined
// obj.name = undefined
- 查看是否删除成功
name in obj // 查看是否存在 name属性名
name in obj && obj.name // 查看是否只是没有属性值
4. 对象的查看
- 查看所有属性名
Object.keys(obj)
(2) ["name", "age"]
- 查看所有属性值
Object.values(obj)
(2) ["tony", 18]
- 查看所有键值
// 方法1
obj
// 方法2
Object.entries(obj)
- 查看是否有该属性
name in obj
- 查看该属性是否是自身属性
obj.hasOwnproperty('toString')
- 查看所有共有属性
console.dir(obj)
- 查看一个属性名对应的属性值
let obj = {name : 'tony', age: 18}
// 方法1
obj['name']
// 方法2
obj.name
// 下面这种方法的name是变量,不是string
obj[name]
5. 对象的修改
let obj = {name : 'tony', age: 18}
// 方法1
obj['name'] = 'jack'
// 方法2 批量修改
Object.assign( obj , {
p1 : 1, p2 : 2, p3 : 3
} )
6. 原型的修改
- 修改共有属性
//方法1(不推荐,会影响性能)
obj.__proto__.toString = 'xxx'
// 方法2
window.Object.prototype.toString = 'yyy'
- 增加原型链
这种方法会在obj的__proto__指向原型的过程中加上一个 用户自定义的原型,用户自定义的原型 会指向js的原型
// 方法1 (不推荐,影响性能)
obj.__proto__ = 'common'
// 方法2
let obj = Object.create(common)