构造函数:
- 创建对象:当需要创建具有相似特性的多个对象时,可以使用构造函数模板创建这些对象。
- 初始化属性:构造函数可以在对象创建时初始化对象的属性,确保对象具有合适的初始状态。
- 封装代码逻辑:构造函数可以用来封装相关的代码逻辑,便于对象的管理和维护。
使用方法:
- 定义构造函数:使用
function
关键字定义一个构造函数,并在其中定义对象的属性和方法。 - 初始化属性:在构造函数内部使用
this
关键字来设置对象的属性。 - 创建对象实例:使用
new
关键字加上构造函数的名称来创建对象实例,构造函数会被调用并执行对象的初始化操作。
new
关键字实例化对象
-
创建一个新对象:
new
关键字创建一个新的空对象,这个新对象会成为实例化的对象。 -
设置对象的原型链连接:新创建的对象会被连接到其构造函数的原型对象上。可以通过构造函数的
prototype
属性来访问原型对象。 -
将构造函数的作用域赋给新对象:在构造函数内部,使用
this
关键字引用新创建的对象。这样可以在构造函数中访问并设置新对象的属性。 -
执行构造函数:构造函数会被调用,并在新对象上执行,可以在构造函数中为新对象设置属性和执行其他必要的操作。
-
返回新对象:如果构造函数中没有显式返回一个对象,则
new
操作符会隐式返回新创建的对象。
实例成员:
实例成员是指属于类的每个对象实例的成员,也称为实例属性或实例方法。每个对象实例都有自己的实例成员副本,它们独立于其他对象实例。实例成员通常存储对象的特定属性值,并且可以通过对象实例访问和操作。
class Person {
constructor(name, age) {
this.name = name; // 实例属性
this.age = age; // 实例属性
}
introduce() { // 实例方法
console.log(`My name is ${this.name} and I am ${this.age} years old.`);
}
}
const person1 = new Person('Alice', 25);
const person2 = new Person('Bob', 30);
person1.introduce(); // 输出: My name is Alice and I am 25 years old.
person2.introduce(); // 输出: My name is Bob and I am 30 years old.
静态成员:
静态成员是指属于类本身而非类的实例的成员,也称为静态属性或静态方法。静态成员在类的定义级别上定义,且被所有对象实例所共享。静态成员通常用于表示与整个类相关的数据或功能,不依赖于特定的对象实例。
class MathUtils {
static pi = 3.14; // 静态属性
static calculateCircleArea(radius) { // 静态方法
return this.pi * radius * radius;
}
}
console.log(MathUtils.pi); // 输出: 3.14
console.log(MathUtils.calculateCircleArea(5)); // 输出
-
String 对象
length
: 返回字符串的长度。charAt(index)
: 返回给定位置的字符。indexOf(substring)
: 返回指定子字符串在原字符串中第一次出现的位置。toUpperCase()
: 将字符串转换为大写字母形式。split(separator)
: 将字符串拆分为数组,按照指定的分隔符进行拆分。
const str = "Hello, World!";
console.log(str.length); // 输出: 13
console.log(str.charAt(0)); // 输出: H
console.log(str.indexOf('World')); // 输出: 7
console.log(str.toUpperCase()); // 输出: HELLO, WORLD!
console.log(str.split(', ')); // 输出: ["Hello", "World!"]
-
Number 对象:
toFixed(digits)
: 将数字转换为字符串,保留指定位小数。toString()
: 将数字转换为字符串。parseInt()
: 将字符串转换为整数。parseFloat()
: 将字符串转换为浮点数。
const num = 3.14159;
console.log(num.toFixed(2)); // 输出: "3.14"
console.log(num.toString()); // 输出: "3.14159"
console.log(parseInt("10")); // 输出: 10
console.log(parseFloat("3.14")); // 输出: 3.14
-
Boolean 对象:
valueOf()
: 返回 Boolean 对象的原始布尔值。toString()
: 将布尔值转换为字符串。
const bool = new Boolean(true);
console.log(bool.valueOf()); // 输出: true
console.log(bool.toString()); // 输出: "true
在 JavaScript 中,构造函数可以用来创建对象,并通过封装数据和方法来实现封装。封装是面向对象编程的基本概念之一,通过封装,我们可以将数据和行为(方法)封装在对象内部,同时隐藏对象的实现细节,只暴露必要的接口供外部调用。构造函数中的属性(数据)和方法(行为)可以通过 this 关键字绑定到新创建的对象上,实现了封装的效果。
下面是一个示例 :
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHello = function() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};
}
const person1 = new Person("Alice", 30);
person1.sayHello(); // 输出: Hello, my name is Alice a
封装也存在一些问题:
数据隐私性问题
方法冗余问题
无法实现真正的私有方法
原型对象:
- 在 JavaScript 中,每个对象都有一个原型对象,它是一个普通的对象。
- 原型对象用于共享属性和方法,供该对象的所有实例访问和继承。
- 对象可以通过
Object.create()
方法指定原型对象,或者通过构造函数及其prototype
属性进行关联。
构造函数:
- 构造函数是用于创建对象的特殊函数,通过
new
关键字调用。 - 构造函数定义了对象的初始状态和行为。
- 通过构造函数创建的对象实例会自动关联到该构造函数的
prototype
属性指向的原型对象,实现继承。
对象原型链:
- 对象原型链是一种通过原型对象实现的链式查找机制,用于属性和方法的继承。
- 每个对象都拥有一个
__proto__
属性,指向其原型对象。 - 当访问对象属性或方法时,如果对象本身没有,则沿着原型链向上查找,直到找到匹配的属性或方法或到达原型链末尾(
null
)。
原型继承:
- 原型继承是 JavaScript 中的一种继承方式,它通过对象的原型链进行继承。
- 当一个对象被用作另一个对象的原型时,它们之间就建立了一种原型继承关系。
- 原型继承的特点是,子对象可以访问和继承原型对象的属性和方法。
- JavaScript 中,可以使用
Object.create()
方法或通过构造函数的prototype
属性来实现原型继承。
原型链:
- 原型链是一种对象与原型对象之间形成的链式关系。
- 每个对象都有一个
__proto__
属性,指向它的原型对象。 - 通过原型链,一个对象可以访问和继承其原型对象的属性和方法,也可以继续向上查找原型对象的原型,形成一条链式关系,直到最终的原型对象为
null
。
instanceof 运算符:
instanceof
是 JavaScript 中的一个运算符,用于检查一个对象是否是某个特定类(或者是其派生类)的实例。- 运算符的语法为
object instanceof constructor
,其中object
是待检查的对象,constructor
是特定的构造函数。 - 如果
object
是constructor
或其派生类的实例,则返回true
,否则返回false
。