在JavaScript中,对象是一种复合数据类型,它使用花括号 {} 包裹一组键值对。每个键(属性名)后面跟着一个冒号 : 和对应的值。键通常是字符串(或符号),而值可以是任意数据类型。
1. 对象字面量
以下是一个简单的对象字面量的示例:
const person = {
name: 'LuQian',
age: 18,
isStudent: false,
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
// 访问属性
console.log(person.name); // 输出: LuQian
console.log(person['age']); // 输出: 18
// 调用方法
person.greet(); // 输出: Hello, my name is LuQian
在这个例子中,person
对象有三个属性:name
、age
和 isStudent
,还有一个方法 greet
。你可以通过点(.)语法或方括号([])语法来访问对象的属性。
2. 对象的浅拷贝和深拷贝,以及原型和继承的示例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>对象</title>
</head>
<body>
<script type="text/javascript">
const person = {
name: 'LuQian',
age: 18,
isStudent: false,
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
// 访问属性
console.log(person.name); // 输出: LuQian
console.log(person['age']); // 输出: 18
// 调用方法
person.greet(); // 输出: Hello, my name is LuQian
// 浅拷贝函数
function shallowCopy(obj) {
return {
...obj
}; // 使用对象扩展运算符实现浅拷贝
}
// 深拷贝函数
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj)); // 使用 JSON 方法实现深拷贝
}
// 测试浅拷贝
const shallowCopiedPerson = shallowCopy(person);
shallowCopiedPerson.name = 'LiSi'; // 修改拷贝的对象
console.log(shallowCopiedPerson.name); // 输出: LiSi
console.log(person.name); // 输出: LuQian(原对象不变)
// 测试深拷贝
const deepCopiedPerson = deepCopy(person);
deepCopiedPerson.age = 20; // 修改拷贝的对象
console.log(deepCopiedPerson.age); // 输出: 20
console.log(person.age); // 输出: 18(原对象不变)
// 原型和继承示例
const student = Object.create(person); // 使用原型继承
student.major = 'Computer Science'; // 添加新属性
student.greet = function() {
console.log(`Hello, my name is ${this.name} and I study ${this.major}`);
};
student.name = 'WangWu'; // 修改学生的名字
student.greet(); // 输出: Hello, my name is WangWu and I study Computer Science
// 检查原型链
console.log(student.isStudent); // 输出: false(从 person 继承)
</script>
</body>
</html>
代码说明
-
浅拷贝:使用对象扩展运算符
{ ...obj }
来实现浅拷贝。对于嵌套对象,拷贝的仍然是引用。 -
深拷贝:使用
JSON.parse(JSON.stringify(obj))
实现深拷贝,能完整复制对象及其嵌套属性。 -
原型和继承:
- 使用
Object.create(person)
创建一个新的对象student
,它继承了person
的属性和方法。 student
可以拥有自己的属性(如major
),并重写greet
方法来增加特定的功能。
- 使用