一.基础概念
Object类型,也称一个对象,是JavaScript中的引用数据类型。对象是一种复合数据类型,它包含多个属性(property)和方法(method)。属性是对象的状态,即对象的数据值;方法是对象的行为,即对象可以执行的操作。
对象也可以看做是属性的无序集合,每个属性都是一个名/值对。对象除了可以创建自有属性,还可以通过从一个名为原型的对象那里继承属性。除了字符串、数字、true、false、null和undefined之外,JavaScript中的值都是对象。
二.创建对象
1. 对象字面量方式
这是创建对象最直接的方式,通过直接编写键值对的形式来定义对象的属性和方法。
let obj = {
property1: 'value1',
property2: 'value2',
method1: function() {
// 方法体
}
};
2. 构造函数方式
使用new关键字和自定义的构造函数来创建对象。构造函数是一种特殊的函数,用于初始化新创建的对象。
function MyObject(property1, property2) {
this.property1 = property1;
this.property2 = property2;
this.method1 = function() {
// 方法体
};
}
let obj = new MyObject('value1', 'value2');
3. Object.create()方法
通过调用Object.create()方法并传入一个原型对象来创建新对象。这种方式基于原型链创建对象,并可以设置对象的原型。
let prototypeObj = {
method1: function() {
// 方法体
}
};
let obj = Object.create(prototypeObj);
obj.property1 = 'value1';
4.工厂函数
工厂函数是一个返回对象的函数,通常用于创建具有相似属性和方法的多个对象。
function createObject(property1, property2) {
return {
property1: property1,
property2: property2,
method1: function() {
// 方法体
}
};
}
let obj = createObject('value1', 'value2');
三.访问和修改对象属性
可以通过对象的属性名(或键名)来访问或修改属性的值。
1.访问对象属性
使用点符号(.)或者方括号([])来访问对象的属性.
(1)使用点运算符
知道属性的确切名称时,点运算符是访问属性的最常见方式。
let obj = {
name: '张三',
age: 30
};
// 访问 name 属性
console.log(obj.name); // 输出: 张三
// 访问 age 属性
console.log(obj.age); // 输出: 30
(2)使用方括号
当属性名是一个变量或包含特殊字符(如空格、连字符或数字开头)时,应该使用方括号。
let obj = {
'first-name': '张三',
'last-name': '李四'
};
// 使用变量来访问属性
let propName = 'first-name';
console.log(obj[propName]); // 输出: 张三
// 直接在方括号内使用字符串访问属性
console.log(obj['last-name']); // 输出: 李四
注:
- 如果尝试访问一个不存在的属性,JavaScript会返回undefined。
- 如果尝试修改一个不存在的属性,JavaScript会创建这个属性并设置其值。
- 使用方括号时,键名(属性名)可以是一个字符串或者可以被转换成字符串的表达式。
- 如果属性名是一个保留字或者包含特殊字符,使用方括号是必需的。
四.原型和继承
原型和继承允许我们创建可复用的对象结构,使得新对象可以继承现有对象的属性和方法。
1.原型
在JavaScript中,每个对象都有一个指向它的原型对象的内部链接。这个原型对象自身也是一个对象,因此它也可以有一个原型,这样层层向上直到一个对象的原型为null。这种链接就构成了所谓的原型链。
当我们试图访问一个对象的某个属性时,如果该对象自身没有这个属性,那么JavaScript会沿着原型链向上查找,直到找到该属性或到达原型链的末尾(null)。
每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
function Person(name) {
this.name = name;
}
Person.prototype.greet = function() {
console.log('Hello, my name is ' + this.name);
};
let john = new Person('John');
john.greet(); // 输出: Hello, my name is John
在上面的例子中,Person函数有一个prototype对象,在这个对象上定义了一个greet方法。当创建Person的一个新实例john时,john并没有自己的greet方法,但是当调用john.greet()时,JavaScript会在john的原型链上找到这个方法并执行它。
2.继承
继承是面向对象编程中的一个重要概念,它允许我们根据一个已有的类(或对象)来定义一个新的类(或对象),使得新类(或对象)可以继承原有类(或对象)的属性和方法。
在JavaScript中,可以通过多种方式实现继承,但最常见的是通过原型链来实现。我们可以让一个类型的原型对象等于另一个类型的实例,从而实现继承。
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(this.name + ' makes a sound');
};
function Dog(name) {
Animal.call(this, name); // 借用Animal的构造函数
}
// 继承Animal的原型
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // 修复constructor指向
Dog.prototype.bark = function() {
console.log(this.name + ' barks');
};
let dog = new Dog('Buddy');
dog.speak(); // 输出: Buddy makes a sound
dog.bark(); // 输出: Buddy barks
注:JavaScript的继承机制与Java或C++的继承机制有所不同。在JavaScript中,继承更多的是基于原型链的委托,而不是基于类的继承。
五.高级特性
1.封装
封装将数据和方法组织成一个独立的单元,通过访问器方法来控制对数据的访问和修改。这有助于保护数据的完整性和安全性,同时也提高了代码的可维护性和可读性。
2.丰富的属性和方法
属性是对象中的变量,包含键(key)和值(value)。方法则是对象中的函数,用于执行特定的操作或返回特定的值。JavaScript还提供了许多内置的对象方法,如Object.is()、Object.assign()、Object.entries()等,这些方法为处理对象提供了强大的功能。