视频加载失败

JavaScript面向对象

1327 字
7 分钟
JavaScript面向对象

本文主要学习Javascript的对象,对象的方法,如何遍历以及如何实现对象的深克隆

认识对象#

对象(object)是“键值对”的集合,表示属性和值的映射 关系

//JS中,大括号表示对象
var xiaoming = {
name: '小明',//属性名(键名,key);属性值(value)
age: 12,
sex: '男',
hobbies: ['足球','编程']
};

对象的语法

k和v之间用冒号分隔,每组k,最后一个 k

var obj = {
k: v,
k: v,
k: v,
k: v
};

属性是否加引号

如果对象的属性键名不符合JS标识符命名规范,则这个键名 必须用引号包裹

var xiaoming = {
name: '小明',
age: 12,
sex: '男',
hobbys: ['足球','游泳','编程'],
'favorite-book': '舒克和贝塔'//属性名中有短横,不符合JS标识符命名规范,属性名必须用引号包裹
};

属性的访问

可以用“点语法”访问对象中指定键的值

xiaoming.name; // '小明'
xiaoming.age; // 12
xiaoming.hobbys; // ['足球','游泳','编程']

如果属性名不符合JS标识符命名规范,则必须用方括号的写 法来访问

xiaoming['favorite-book']; // '舒克和贝塔';不符合标识符命名规范,就必须用方括号访问属性

如果属性名以变量形式存储,则必须使用方括号形式

var obj = {
a: 1,
b: 2,
c: 3
};
var key = 'b';
console.log(obj.key);// undefined
console.log(obj[key]);// 2

解释一下:var key = ‘b’;其实这里很明显就是key就是b,obj[key]=obj[‘b’];根据属性名不符合JS标识符命名规范,则必须用方括号的写 法来访问,这里就是2,因为符合JS标识符命名规范,也可以用方括号的写 法来访问

属性的更改

直接使用赋值运算符重新对某属性赋值即可更改属性

var obj = {
a: 10
};
obj.a = 30;
obj.a++;

属性的创建

如果对象本身没有某个属性值,则用点语法赋值时,这个属 性会被创建出来

var obj = {
a: 10
};
obj.b = 40;

属性的删除

如果要删除某个对象的属性,需要使用delete操作符

var obj = {
a: 1,
b: 2
};
delete obj.a;

对象的方法#

如果某个属性值是函数,则它也被称为对象的“方法”

var xiaoming = {
name: '小明',
age: 12,
sex: '男',
hobbys: ['足球', '游泳', '编程'], 'favorite-book': '舒克和贝塔',
sayHello: function () {
console.log('你好,我是小明,今年12岁,我是个男生');
}
};

方法的调用

使用“点语法”可以调用对象的方法

xiaoming.sayHello();

方法也是函数,只不过方法是对象的“函数属性”,它需要 用对象打点调用

在正式学习了什么是“方法”之后,就能深入理解之前我们 学习的一些函数的书写形式了,比如:

console.log();
Math.ceil();

对象的遍历#

  • 和遍历数组类似,对象也可以被遍历,遍历对象需要使用 for…in…循环
  • 使用for…in…循环可以遍历对象的每个键
  • 在后续的ES6相关课程中,还会学习新的对象遍历的方式

for…in…循环

//var k:循环变量,它会依次成为对象的每一个键;obj:要遍历的对象
for (var k in obj) {
console.log('属性' + k + '的值是' + obj[k]);
}

对象的深浅克隆#

对象是引用类型值

对象是引用类型值,这意味着:

不能用var obj2 = obj1这样的语法克隆一个对象

var obj3 = {
a: 10,
};
//obj4指向obj3,完全一个东西
var obj4 = obj3;
obj3.a++;
console.log(obj4);

使用==或者===进行对象的比较时,比较的是它们是否为内 存中的同一个对象,而不是比较值是否相同

var obj1 = {
a: 1,
b: 2,
c: 3,
};
var obj2 = {
a: 1,
b: 2,
c: 3,
};
console.log(obj1 == obj2); //false 不同内存
console.log(obj1 === obj2); //false

对象的浅克隆

复习什么是浅克隆:只克隆对象的“表层”,如果对象的某 些属性值又是引用类型值,则不进一步克隆它们,只是传递 它们的引用

使用for…in…循环即可实现对象的浅克隆

// 浅克隆
var obj1 = {
a: 10,
b: 2,
c: [11, 22, 33],
};
// var obj2 = obj1; //不是克隆
var obj2 = {};
for (var k in obj1) {
obj2[k] = obj1[k];
}
obj1.a++;
obj1.c.push(77); //obj2也会推入77,因为是浅克隆
console.log(obj1 === obj2);
console.log(obj1);
console.log(obj2);

对象的深克隆

复习什么是深克隆:克隆对象的全貌,不论对象的属性值是 否又是引用类型值,都能将它们实现克隆

和数组的深克隆类似,对象的深克隆需要使用递归

面试时经常会考察深克隆算法,必须掌握

// 深克隆
var obj1 = {
a: 10,
b: 2,
c: [
11,
22,
33,
{
m: 55,
n: 66,
p: [11, 33],
},
],
};
function deepClone(obj) {
if (Array.isArray(obj)) {
//数组的处理方式
var result = [];
for (var i = 0; i < obj.length; i++) {
result.push(deepClone(obj[i]));
}
} else if (typeof obj == 'object') {
//对象
var result = {};
for (var k in obj) {
result[k] = deepClone(obj[k]);
}
} else {
var result = obj;
}
return result;
}
var obj2 = deepClone(obj1);
obj1.a++;
obj1.c.push(77); //obj2不会推入77,因为是深克隆
console.log(obj1 === obj2);
console.log(obj1);
console.log(obj2);

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

JavaScript面向对象
https://f.youzi177.cn/posts/2026102005javascript-mian-xiang-dui-xiang/
作者
小封鸭
发布于
2026-10-20
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
小封鸭
小楼一夜听春雨,深巷明朝卖杏花
公告
欢迎来到我的博客。这里主要记录前端全栈和日常内容
分类
标签
最新动态
站点统计
文章
60
分类
3
标签
12
总字数
107,734
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
EdgeOne Pages
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录