工厂模式与javascript中的构造函数模式

Car*_*los 7 javascript design-patterns

我在javascript中看到了一个关于设计模式的教程.虽然教程很好但它给我留下了一些问题.

正如我所见,Factory和构造函数产生相同的结果.那么它们之间的区别是什么?每个用例场景有哪些?

工厂模式

function factoryPattern(data) {
  var factory = {};
  factory.name = data.name;
  factory.title = data.title;
  factory.startDate = data.startDate;
  return factory;
}
var factoryUse = factoryPattern(jsonObj);
Run Code Online (Sandbox Code Playgroud)

构造函数模式

function constructorPattern(data) {
  this.name = data.name;
  this.title = data.title;
  this.startDate = data.startDate;
}

var constructorUse = new constructorPattern();
Run Code Online (Sandbox Code Playgroud)

编辑:正如@Michael华纳所解释的那样.Factory方法返回不可变对象,它们在创建后没有链接到其创建者.

但是在构造函数模式中,它们确实与它们有关联.

因此,有一个实际的用例会更好地理解为什么有时候有一个与其构造函数链接的对象是好的.

Mic*_*ner 7

工厂创建一个对象并返回它.就是这样.创建的对象是独立的,关于此的最好的部分是您可以使用该对象而不受其他对象发生的影响.这被称为单身人士.

var Car = function(){
    var car = {};
    car.running = false;
    car.toggleEngine = function(){
        this.running = !this.running;
    }
    return car;
};

car1 = Car(); // running false
car2 = Car(); // running false
car1.toggleEngine(); // running true
car2.toggleEngine = undefined; // to broke down.
car1.toggleEngine(); //running false
Run Code Online (Sandbox Code Playgroud)

构造函数向函数添加代码,因此您可以链接到对象构造函数的原型.关于这个附加链接的好处是使用看起来像这样的功能共享技术.

var Car = function (){
    this.running = false;
};
Car.prototype.toggleEngine = function(){
    this.running = !this.running;
}
var car1 = new Car; //running false
var car2 = new Car; //running false

car2.toggleEngine() //running true
Car.prototype.toggleEngine = function(){};
car1.toggleEngine() //running false
Run Code Online (Sandbox Code Playgroud)

正如我们在创建对象后所看到的那样,它们仍然非常相关.

要清楚,您仍然可以执行以下操作,而不会影响构造函数创建的对象.使用功能共享方法并屏蔽构造函数给出的原型函数.所以没有完全链接,但它们通过构造函数原型链接.

var car1 = new Car; //running false
var car2 = new Car; //running false

car2.toggleEngine() //running true
car2.toggleEngine = function(){};
car1.toggleEngine() //running true
Run Code Online (Sandbox Code Playgroud)

  • 好的,这是很好的解释,所以你能指出我的用例,其中有一个链接到构造函数是有用的 (2认同)