一. 构造器模式
function Employee(name,sex){
this.name=name;
this.sex=sex;
this.say=function (){
console.log("hello,我是构造器模式")
}
}
var employe1=new Employee("张三","男");
console.log(employe1)
构造器模式缺点:
- 构造函数的函数名与类名相同,在调用时容易造成混淆;
- 构造函数的参数没有默认值,没有类型检测,没有长度限制,没有递归调用,不能被继承,
- 创建多个相同对象时,会产生很多重复代码。 总的来说,它使用了函数和原型链来创建对象,这可能会导致一些性能方面的问题。例如,每次创建新对象时,都需要调用构造函数,这会影响程序的性能。同时,在创建对象时,对象中的属性和方法都需要通过原型链来查找,这也会消耗性能。
二. 原型模式
/**
*
* @param name
* @param sex
* @constructor
* 基于构造器模式进行改造 */
function Employee(name,age,salary){
this.name = name;
this.age =age;
this.salary=salary;
}
Employee.prototype.say=function(){
console.log(this.name+"-",this.age+"-",this.salary)
}
var sex=new Employee("张三","男",10000);
sex.say()
/** es6 class形式**/
class Employee {
constructor(name, age, salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
say() {
console.log(this.name + "-", this.age + "-", this.salary);
}
}
const sex = new Employee("张三", "男", 10000);
sex.say();
这段代码是基于上文的构造器模式进行了改造,使用原型链的方式,可以将共享的方法 say() 添加到 Employee.prototype 中,避免在每个对象实例中重复定义该方法,节省内存空间。但是在遇到大量的实例的时候,每次创建对象实例时,都需要调用构造函数 Employee,就会显得束手无措。
原型模式的应用场景主要体现在:
- 创建复杂对象:当需要创建一个复杂的对象,并且这个对象由多个部分组成时,可以使用原型模式。通过将这个复杂对象分解成多个简单的部分,并将每个部分作为原型实例化,最终将它们组装成一个完整的对象。
- 提高性能:当需要创建大量的相似对象时,使用原型模式可以提高性能。因为使用原型模式,每个对象都是通过克隆来创建的,而不是重新实例化,这样可以节省内存,并减少创建对象的时间。
- 动态配置:原型模式允许动态配置对象属性,如果需要修改对象的属性,只需修改原型的属性,然后在需要修改的对象上调用克隆方法即可。
- 实现基于原型的继承:原型模式可以用于实现基于原型的继承。子类可以通过克隆父类的原型来继承父类的属性和方法。这种方式比传统的基于类的继承更加灵活,更容易实现多重继承。
原型模式应用场景
示例1-创建一个汽车销售系统
function Car(brand, model, price) {
this.brand = brand;
this.model = model;
this.price = price;
}
Car.prototype.calculateDiscountedPrice = function(discountRate) {
var discountedPrice = this.price * (1 - discountRate);
return discountedPrice;
};
// 创建多个汽车对象实例
var car1 = new Car("Toyota", "Camry", 30000);
var car2 = new Car("Honda", "Civic", 25000);
var car3 = new Car("BMW", "X5", 60000);
// 计算折扣后的汽车价格
var discountRate = 0.1; // 10% 折扣
var car1DiscountedPrice = car1.calculateDiscountedPrice(discountRate);
var car2DiscountedPrice = car2.calculateDiscountedPrice(discountRate);
var car3DiscountedPrice = car3.calculateDiscountedPrice(discountRate);
console.log(car1.brand + " " + car1.model + " Discounted Price: $" + car1DiscountedPrice);
console.log(car2.brand + " " + car2.model + " Discounted Price: $" + car2DiscountedPrice);
console.log(car3.brand + " " + car3.model + " Discounted Price: $" + car3DiscountedPrice);
示例2-创建和克隆对象
// 定义一个原型对象
const carPrototype = {
brand: "",
color: "",
year: 0,
// 打印车辆信息
printInfo: function() {
console.log(`Brand: ${this.brand}, Color: ${this.color}, Year: ${this.year}`);
},
// 克隆方法
clone: function() {
// 创建一个新对象,并将原型属性复制给它
const clonedCar = Object.create(this);
return clonedCar;
}
};
// 创建一个对象实例并设置属性
const myCar = carPrototype.clone();
myCar.brand = "Tesla";
myCar.color = "Red";
myCar.year = 2022;
// 打印车辆信息
myCar.printInfo();
// 创建另一个对象实例并设置属性
const yourCar = carPrototype.clone();
yourCar.brand = "BMW";
yourCar.color = "Blue";
yourCar.year = 2021;
// 打印车辆信息
yourCar.printInfo();