在前面的教程中,我们已经介绍了JavaScript中的数据类型包括基本数据类型和引用数据类型,引用数据类型包括对象(Object)。对象(object)是JavaScript中使用最多的一种数据类型,也是最重要的数据类型。在前端开发中,经常会涉及到与后端进行数据交互,JavaScript对象被广泛用于存储和组织数据。
1、什么是对象
在JavaScript中,对象(object)就是一组“键值对”(key、value)的集合,是一种无序的复合数据集合,用于存储多个不同的数据类型,包括数字、字符串、布尔值、数组等。对象通常由花括号“{}”定义,它可以包含多个键值对,每个键值对由一个键(key)和一个值(value)组成。例如:
let person = {
name: "张三",
age: 25,
};
上面代码中,我们通过花括号“{}”定义了一个对象,它被赋值给变量person,所以变量person就指向一个对象。该对象内部包含两个键值对(又称为两个“成员”),第一个键值对是name: "张三",其中name是“键名”(成员的名称),字符串“张三”是“键值”(成员的值)。键名与键值之间用英文的冒号“: ”分隔。第二个键值对是“age: 25”,age是键名,25是键值。两个键值对之间用逗号分隔。
对象的所有键名都是字符串类型,所以加不加引号都可以。所以,上面的代码也可以写成下面的形式:
let person = {
"name": "张三",
"age": 25,
};
(1)对象中的属性
在JavaScript中,对象中的所有键值对我们称为成员,每一个键名又称为属性(property),它的键值也称为属性的值,可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为方法,它可以像函数那样调用。例如:
动手练一练:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript中的对象</title>
</head>
<body>
<body>
<script>
let person = {
name: "张三",
age: 25,
say: function() {
console.log("你好!我是张三。");
}
};
person.say(); // 输出 你好!我是张三。
</script>
</body>
</html>
通过浏览器执行以上代码,我们按F12键打开浏览器的控制台,可以看到输出结果为:
你好!我是张三。
上面的例子中,我们创建了一个person对象。其中,person对象的属性say指向一个函数,所以我们可以直接通过person.say()方法调用函数。
(2)对象的调用
对象里面的属性调用:可以通过“对象.属性名”的访问方式,来调用或修改属性的值。也可以通过另一种方式 : 对象["属性名"],同样可以调用或修改属性的值,注意方括号里面的属性必须加引号。还可以通过“delete 对象.属性名”或“delete 对象["属性名"]”方法删除某一个属性。
对象里面的方法调用:对象.方法名() ,注意这个方法名字后面一定加括号。
对象的调用示例如下:
动手练一练:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript中的对象</title>
</head>
<body>
<body>
<script>
let person = {
name: "张三",
age: 25,
say: function() {
console.log("你好!我是张三。");
}
};
person.say(); // 输出 你好!我是张三。
console.log(person.name); // 输出 张三
console.log("你好!我是" + person["name"]); // 输出 你好!我是张三
person.name = "李四"; // 修改属性的值
console.log(person.name); // 输出 李四
delete person.name // 删除属性的值
console.log(person.name); // 输出 undefined
</script>
</body>
</html>
通过浏览器执行以上代码,我们按F12键打开浏览器的控制台,可以看到输出结果为:
你好!我是张三。
张三
你好!我是张三
李四
undefined
(3)利用new Object()创建对象
和数组(Array)类似,不仅可以通过花括号“{}”创建一个对象,还可以通过new Object()方法创建对象。例如:
动手练一练:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript中的对象</title>
</head>
<body>
<body>
<script>
let person = new Object();
person.name = "张三",
person.age = 25,
person.sex = "男";
person.say = function() {
console.log("你好!我是张三。");
};
person.say(); // 输出 你好!我是张三。
console.log(person.name); // 输出 张三
console.log(person); // 输出 {name: '张三', age: 25, sex: '男', say: ƒ}
</script>
</body>
</html>
通过浏览器执行以上代码,我们按F12键打开浏览器的控制台,可以看到输出结果为:
你好!我是张三。
张三
{name: '张三', age: 25, sex: '男', say: ƒ}
上面的例子中,我们通过使用new关键字,接着跟上Object构造函数,再通过给对象person动态添加上不同的属性和方法。这种方式相对来说比较繁琐,一般推荐直接通过花括号“{}”创建对象。
(4)使用构造函数创建对象
如果需要创建多个相同的对象,可以使用构造函数的方式。构造函数是一种特殊的函数,主要用来初始化对象,即为对象属性赋初始属性值,它总与new运算符一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个构造函数里面。例如:
动手练一练:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript中的对象</title>
</head>
<body>
<body>
<script>
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.say = function() {
console.log("我的名字叫:" + this.name + ",年龄:" + this.age + ",性别:" + this.sex);
}
}
let teacher = new Person("张三", 25, "男");
let student = new Person("李四", 18, "男");
console.log(teacher.name); // 输出 张三
console.log(student.name); // 输出 李四
teacher.say(); // 输出 我的名字叫:张三,年龄:25,性别:男
</script>
</body>
</html>
通过浏览器执行以上代码,我们按F12键打开浏览器的控制台,可以看到输出结果为:
张三
李四
我的名字叫:张三,年龄:25,性别:男
上面的例子中,我们创建了一个构造函数Person() ,注意,JavaScript中构造函数一般约定首字母大写。接着,通过new和构造函数名创建新的对象teacher和student。注意,当我们创建新对象的时候,必须用new来调用构造函数。构造函数内的属性和方法前面需要添加this,表示当前对象的属性和方法。this通常指向的是我们正在执行的函数本身,或者是指向该函数所属的对象。
(5)对象的遍历
在实际开发中,有时需要查询一个对象拥有哪些属性和方法,这时就需要进行对象的遍历。对象的遍历是指遍历对象中所有的成员。我们可以使用for…in语法可以进行对象的遍历,其语法格式为:for(变量 in 对象){具体操作}。例如:
动手练一练:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript中的对象</title>
</head>
<body>
<body>
<script>
let person = {
name: "张三",
age: 25,
sex:"男",
};
for (let key in person) {
console.log(key + ': ' + person[key]);
}
</script>
</body>
</html>
通过浏览器执行以上代码,我们按F12键打开浏览器的控制台,可以看到输出结果为:
name: 张三
age: 25
sex: 男
上面的例子中,通过使用for…in语法进行对象的遍历,我们还可以使用对象内置方法Object.keys()、Object.values()和Object.entries()等方法来获取对象的键、值或键值对数组,从而进行更灵活的操作。例如:
动手练一练:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript中的对象</title>
</head>
<body>
<body>
<script>
let person = {
name: "张三",
age: 25,
sex:"男",
};
// 返回给定对象中包含所有“属性”组成的数组
console.log(Object.keys(person));
// 返回给定对象中包含所有“属性值”组成的数组
console.log(Object.values(person));
// 返回给定对象中包含所有“键值对”组成的数组
console.log(Object.entries(person));
// 获取给定对象自身的所有属性
console.log(Object.getOwnPropertyNames(person));
</script>
</body>
</html>
通过浏览器执行以上代码,我们按F12键打开浏览器的控制台,可以看到输出结果为:
['name', 'age', 'sex']
['张三', 25, '男']
[['name', '张三'], ['age', 25], ['sex', '男']]
['name', 'age', 'sex']
JavaScript中虽然有对象的概念,但是和Python相比,并没有封装、继承、多态的机制,所以JavaScript不是一个“面向对象”的语言。