【前端知识】JavaScript——设计模式(工厂模式、构造函数模式、原型模式)
一、工厂模式
工厂模式是一种众所周知的设计模式,广泛应用于软件工程领域,用于抽象创建特定对象的过程。
优点:可以解决创建多个类似对象的问题
缺点:没有解决对象标识问题(即新创建的对象是什么类型)
示例:
function createPerson(name, age, job) {
// 创建对象,将值赋值给该对象后,返回
let o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function() {
console.log(this.name);
};
// 返回对象
return o;
}
let person1 = createPerson("Nicholas", 29, "Software Engineer");
let person2 = createPerson("Greg", 27, "Doctor");
二、构造函数模式
构造函数模式与工厂模式相比,没有显式地创建对象,其属性和方法直接赋值给了 this,且没有 return。
优点:定义自定义构造函数可以确保实例被标识为特定类型
缺点:其定义的方法会在每个实例上都创建一遍
示例:
// 区别1: 函数名大写,为了与普通函数区分
function Person(name, age, job){
// 区别2: 与工厂模式不同,传入的参数赋值给this
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
console.log(this.name);
};
// 区别3: 无需返回对象
}
// 区别4: 通过new操作符,创建Person实例
let person1 = new Person("Nicholas", 29, "Software Engineer");
let person2 = new Person("Greg", 27, "Doctor");
person1.sayName(); // Nicholas
person2.sayName(); // Greg
注意:使用 new 操作符调用构造函数的执行过程:
三、原型模式
每个函数都会创建一个 prototype 属性,这个属性是一个对象,包含应该由特定引用类型的实例共享的属性和方法。
优点:在它上面定义的属性和方法可以被对象实例共享
缺点:所有实例在默认情况先都将取得相同的属性值
示例:
function Person() {}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function() {
console.log(this.name);
};
let person1 = new Person();
person1.sayName(); // "Nicholas"
let person2 = new Person();
person2.sayName(); // "Nicholas"
console.log(person1.sayName == person2.sayName); // true