自执行函数(IIFE)
- 定义: 自执行函数(IIFE, Immediately Invoked Function Expression)是一种函数表达式,它在定义后立即执行。它通常用于创建一个新的作用域来避免变量污染全局作用域。
- 语法
(function() {
// 这里是函数体
console.log('I am an IIFE!');
})();
- 示例
// 传统的 IIFE
(function() {
var x = 'Hello';
console.log(x); // 输出 'Hello'
})();
// 外部无法访问 x
console.log(typeof x); // 输出 'undefined'
IIFE 返回一个对象,其中包含自定义函数,将自定义函数暴露到外部作用域中。这可以通过 IIFE 返回一个对象来实现
const module = (function() {
// 内部函数
function privateFunction() {
console.log('This is a private function.');
}
// 公共函数
function publicFunction() {
console.log('This is a public function.');
}
// 返回一个对象,将公共函数暴露到外部
return {
publicFunction: publicFunction
};
})();
// 调用暴露的公共函数
module.publicFunction(); // 输出: This is a public function.
// 尝试调用私有函数会失败
// module.privateFunction(); // TypeError: module.privateFunction is not a function
自执行函数(IIFE)可以用来模拟类中的构造函数。示例如下:
const MyClass = (function() {
// 构造函数
function createInstance(name) {
return {
name: name,
greet: function() {
console.log(`Hello, my name is ${this.name}.`);
}
};
}
// 返回构造函数
return createInstance;
})();
// 创建实例
const instance = MyClass('Alice');
instance.greet(); // 输出: Hello, my name is Alice.
类(class)
- 定义: class 语法是 ECMAScript 6(ES6)引入的,提供了一种更简单和直观的方式来创建和管理对象的构造函数和原型方法。它是 JavaScript 的面向对象编程(OOP)的一部分。
- 语法
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
// 创建一个 Person 实例
const person1 = new Person('Alice', 30);
person1.greet(); // 输出 'Hello, my name is Alice and I am 30 years old.'
- 特点
构造函数: constructor 方法是创建对象时自动调用的方法。
原型方法: 方法定义在类的内部,可以被所有实例共享。
继承: 可以通过 extends 关键字创建子类,继承父类的属性和方法。 - 示例
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rover');
dog.speak(); // 输出 'Rover barks.'
对比
IIFE: 主要用于创建局部作用域,保护变量不被外部访问,常用于模块化代码。
class: 主要用于面向对象编程,提供了一种结构化的方式来创建对象和管理继承关系。
自执行函数可以模拟类
- 模拟类及其构造函数
const MyClass = (function() {
// 构造函数
function MyClass(name) {
this.name = name;
}
// 原型方法
MyClass.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}.`);
};
// 返回构造函数
return MyClass;
})();
// 创建实例
const instance = new MyClass('Alice');
instance.greet(); // 输出: Hello, my name is Alice.