1.对象含义和创建
- 含义:对象是拥有属性和方法的数据
- 创建方式一:字面量声明
var person = {}
var person = new Object()
2.增(添加属性)
var person = {}
person.name = "kyo"
- 通过api添加:Object.defineProperty(obj, key,options),默认只读且不可被枚举,如果属性已经存在,则相当于更新该属性的属性描述对象
属性名 |
默认值 |
说明 |
value |
|
属性值 |
writable |
false |
值是否可被修改,默认只读 |
configurable |
false |
属性是否可被重新配置 |
enumerable |
false |
是否可被枚举,默认false,不可被for in 和Object.keys() 遍历到 |
get |
|
function 属性被读取时执行 |
set |
|
function 属性被赋值时执行 |
var person = {
name:'key',
age:20
}
Object.defineProperty(person,'brithday',{
value:"2020-12-28",
})
- 获取属性描述对象:Object.getOwnPropertyDescriptor(obj,key)
<script>
var person = {
name:'key',
age:20
}
Object.defineProperty(person,'brithday',{
value:"2020-12-28",
})
console.log(Object.getOwnPropertyDescriptor(person, 'name'))
console.log(Object.getOwnPropertyDescriptor(person, 'brithday'))
</script>
3.删(删除属性)
- 通过运算符 delete 进行删除, 删除成功返回true,删除失败返回false
- 属性是只读时,会触发删除失败
<script>
var person = {}
person.name = 'kyo'
person.age = 20
Object.defineProperty(person,'id',{
value: 1,
writable: false
})
console.log(delete person.age)
console.log(delete person.friend)
console.log(delete person.id)
console.log(person)
</script>
3.改(修改字段值)
<script>
var person = {
name: 'kyo',
age: 20
}
person.age = 21
console.log(person)
</script>
4.查
- 可枚举:通过字面量方式添加的属性都是可枚举的,只有Object.defineProperty()方式添加的才有不可枚举的可能性,涉及遍历的方法,都只能遍历可枚举的属性,后面不再标注
- 属性遍历:使用 for in 对属性名称进行遍历
<script>
var person = {}
person.name = 'kyo'
person.age = 20
Object.defineProperty(person,'id',{
value: 1,
})
for(var key in person){
console.log(key)
}
</script>
- 获取属性名列表:Object.keys() - 将对象属性组合成数组返回
<script>
var person = {}
person.name = 'kyo'
person.age = 20
Object.defineProperty(person,'id',{
value: 1,
})
var keys = Object.keys(person)
console.log(keys)
</script>
- 获取属性值列表:Object.values() - 将对象属性值组合成数组返回
<script>
var person = {}
person.name = 'kyo'
person.age = 20
Object.defineProperty(person,'id',{
value: 1,
})
var keys = Object.values(person)
console.log(keys)
</script>
- 获取属性和属性值列表:Object.entries() - 将对象转换成二维数组返回,及 [[key1,value1],[key2,value2]]
<script>
var person = {}
person.name = 'kyo'
person.age = 20
Object.defineProperty(person,'id',{
value: 1,
})
var result = Object.entries(person)
console.log(result)
</script>
- 判断自身属性:hasOwnProperty(key) / in 运算符 原型链上的不算
<script>
var person = {}
person.name = 'kyo'
person.age = 20
Object.defineProperty(person,'id',{
value: 1,
})
console.log(person.hasOwnProperty('name'))
console.log(person.hasOwnProperty('id'))
console.log(person.hasOwnProperty)
console.log(person.hasOwnProperty('hasOwnProperty'))
'name' in person
</script>
- 获取属性名列表2:Object.getOwnPropertyNames - 相当于Object.keys()的加强版,能遍历不可枚举属性
<script>
var person = {}
person.name = 'kyo'
person.age = 20
Object.defineProperty(person,'id',{
value: 1,
})
var keys = Object.getOwnPropertyNames(person)
console.log(keys)
</script>
5.对象属性值合并
- 将一个或多个对象的键值对合并到目标对象中并将目标对象返回:Object.assign(target, ...sources) 执行完毕后,target会被改变
- 注意:操作完成后,target会被改变,如果有同名字段,则会被后面的对象覆盖
<script>
var person = {
name: 'key',
age: 20
}
var skill_1 = {
html: "熟练",
js: "熟练"
}
var skill_2 = {
php: "空白",
database: "空白",
age: 25
}
console.log(Object.assign(person,skill_1,skill_2))
console.log(person)
console.log(skill_1)
console.log(skill_2)
</script>
6.空对象
- 对象的非空验证思路很简单,遍历其属性名即可,存在一个或者一个以上的属性名,就表示不为空
<script>
function ObjIsEmpty(obj){
var isEmpty = true
for(key in obj){
isEmpty = false
}
return isEmpty
}
var obj = {}
var obj2 = {a:1, b:2}
console.log(ObjIsEmpty(obj))
console.log(ObjIsEmpty(obj2))
</script>
7.转换成JSON字符串
- 通过JSON.stringify()可将对象转换成JSON字符串
<script>
var obj = {}
var obj2 = {a:1, b:2}
console.log(JSON.stringify(obj))
console.log(JSON.stringify(obj2))
</script>
- 通过JSON.parse()可将JSON字符串转换成对象
<script>
var objStr = '{"a":1, "b":2}'
var obj = JSON.parse(objStr)
console.log(obj.a,obj.b)
</script>
8.数据代理与数据劫持
- 数据劫持:通过Object.defineProperty()方法给对象添加字段,就可以监听字段的读取与修改
- 数据代理:数据劫持过程中的set方法不能操作自身的字段值,会造成死循环,所以数据劫持时只能操作第三方的数据,称之为 数据代理
<script>
var vm = {}
var data = {
name: "张飒",
age: 20
}
Object.defineProperty(vm,'name',{
configurable: false,
enumerable: true,
get(){
return data.name
},
set(newVal){
console.log('name 值发生变动,请修改页面对应的元素',)
data.name = newVal
}
})
Object.defineProperty(vm,'age',{
configurable: false,
enumerable: true,
get(){
return data.age
},
set(newVal){
console.log('age 值发生变动,请修改页面对应的元素',)
data.age = newVal
}
})
console.log(vm.name,vm.age)
vm.name = "李四"
console.log(vm.name,vm.age)
</script>
9.对象拷贝
<script>
function Person(name,age){
this.name = name
this.age = age
}
Person.prototype.sayHello = function(){
console.log(`我的名字是${this.name},今年${this.age}岁`)
}
var p1 = new Person("张三",20)
var p2 = JSON.parse(JSON.stringify(p1))
function copyObject(obj){
var orig_Prototype = Object.getPrototypeOf(obj)
var new_obj = Object.create(orig_Prototype)
Object.getOwnPropertyNames(obj).forEach((propKey)=>{
var desc = Object.getOwnPropertyDescriptor(obj, propKey)
Object.defineProperty(new_obj, propKey, desc)
})
return new_obj
}
var p3 = copyObject(p1)
p3.sayHello()
console.log(p3.constructor)
</script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了