一、工厂模式
工厂模式是一种用函数来实现创建对象的方法,这些函数可以被视为工厂,并且可以按需创建对象。它比使用构造函数的方式具有更高的抽象层次。以下是一个完整的工厂模式示例:
function Car(name, brand, price) {
let car = {};
car.name = name;
car.brand = brand;
car.price = price;
car.display = function() {
console.log(`The car is a ${this.brand} ${this.name} which costs ${this.price}.`);
}
return car;
}
let bmw = Car('328i', 'BMW', 500000);
let benz = Car('S-Class', 'Mercedes-Benz', 800000);
bmw.display();
benz.display();
这里定义了一个Car()
函数,该函数以name
,brand
和price
参数作为输入,并返回一个具有这些属性的对象。可以通过多次调用这个函数来创建多个不同的车辆对象。
二、构造函数模式
使用构造函数创建自定义类型是一种常用的模式,它使用new
关键字和一个函数来创建对象。这种方式的好处是可以更方便地在对象内部定义属性和方法。以下是一个完整的构造函数模式示例:
function Car(name, brand, price) {
this.name = name;
this.brand = brand;
this.price = price;
this.display = function() {
console.log(`The car is a ${this.brand} ${this.name} which costs ${this.price}.`);
}
}
let bmw = new Car('328i', 'BMW', 500000);
let benz = new Car('S-Class', 'Mercedes-Benz', 800000);
bmw.display();
benz.display();
与工厂模式不同的是,这里使用this
关键字来定义对象的属性和方法。使用new
关键字调用构造函数,创建一个新的Car
对象并返回。这种方式在定义属性和方法时更方便,但是每个对象都会定义自己的方法,这意味着每个对象都会占用更多的内存。
三、原型模式
原型模式是一种创建对象的方式,它使用一个常规的函数并在对象中进行定义。方法和属性被添加到函数的prototype
属性中,从而可以被所有实例共享。以下是一个完整的原型模式示例:
function Car() {}
Car.prototype.name = '';
Car.prototype.brand = '';
Car.prototype.price = 0;
Car.prototype.display = function() {
console.log(`The car is a ${this.brand} ${this.name} which costs ${this.price}.`);
}
let bmw = new Car();
bmw.name = '328i';
bmw.brand = 'BMW';
bmw.price = 500000;
bmw.display();
let benz = new Car();
benz.name = 'S-Class';
benz.brand = 'Mercedes-Benz';
benz.price = 800000;
benz.display();
上述示例定义了一个Car()
函数,prototype
属性中添加了三个属性和一个方法。可以使用new
关键字调用Car()
并创建多个实例,这些实例都可以访问相同的方法和属性。
四、动态原型模式
动态原型模式是一种创建对象的方式,它在必要时在对象中定义方法和属性。这种方式允许在不使用原型一样的结构的情况下,使用构造函数的方法来创建对象。以下是一个完整的动态原型模式示例:
function Car(name, brand, price) {
this.name = name;
this.brand = brand;
this.price = price;
if (typeof this.display !== 'function') {
Car.prototype.display = function() {
console.log(`The car is a ${this.brand} ${this.name} which costs ${this.price}.`);
}
}
}
let bmw = new Car('328i', 'BMW', 500000);
bmw.display();
let benz = new Car('S-Class', 'Mercedes-Benz', 800000);
benz.display();
动态原型模式的核心是在构造函数内部使用if
语句来检查实例上是否有一个已定义的方法。如果没有,就使用prototype
对象来定义此方法。这种方式使得方法可以被继承并且不会被重复定义,从而节省内存。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】 - Python技术站