‌JavaScript中的对象(Object)(第6节)


在前面的教程中,我们已经介绍了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不是一个“面向对象”的语言。