javascript – 技术上与工厂模式的Parasitic Constructor模式有何不同

Parasitic Constructor Pattern可以看作是工厂和构造函数模式的组合.
在工厂模式中,我们调用一个函数,然后显式创建一个对象,并向对象添加所需的属性方法,最后返回该对象.

function createPerson(name,age,job){
    var o = new Object();   //explicit object creation
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function(){
            alert(this.name);
        };
    return o;
}

var person1 = createPerson(“Nicholas”,29,“Software Engineer”);
var person2 = createPerson(“Greg”,27,“Doctor”);

注意事项:

>创建并返回显式对象
>方法属性添加到显式创建的对象中
>没有new运算符调用方法

缺点:它不允许识别对象的类型.

通过使用new运算符调用任何函数都可以将其视为构造函数.在没有new运算符的情况下调用时,在该函数内,该对象指向全局对象(浏览器中的窗口).当使用new运算符调用函数时,它首先创建对象的新实例,然后将此对象设置为新创建的对象.

构造函数模式向此对象添加方法属性,最后返回此对象,从而允许稍后使用instanceOf运算符标识对象的类型.

function Person(name,job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
            alert(this.name);
        };
    }

    var person1 = new Person(“Nicholas”,“Software Engineer”);
    var person2 = new Person(“Greg”,“Doctor”);

注意事项:

>使用new运算符调用函数(使JavaScript引擎将其视为构造函数)
>对象未显式创建,而是返回此对象

现在Parasitic Constructor Pattern显式创建并返回一个类似于工厂模式的对象,并使用new运算符调用构造函数模式:

function Person(name,job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function(){
            alert(this.name);
        };
    return o;
}

var friend = new Person(“Nicholas”,“Software Engineer”);
friend.sayName(); //”Nicholas”

但是,我无法看到使用new运算符调用函数.我的意思是,因为函数显式创建并返回对象,所以我们无法使用instanceOf运算符显式地标识对象类型.

那么Parasitic Constructor模式有什么好处呢?是否有任何可以被利用或适用于特定对象创建场景的技术细微之处?或者只是另一种可能的编程方法来创建对象?

最佳答案
我认为你在工厂中跳过的部分是,在大多数其他语言中,工厂要么要制​​作多种不同类似的对象,要么像下面这样做:

var truck = carFactory("Truck");
var jeep  = carFactory("Jeep");

或完成如下:

var piano = instrumentFactory.piano("Grand");
var bass  = instrumentFactory.bass("Upright");

或者你希望它拥有的任何其他界面……

或者工厂的责任是通过依赖注入和潜在的多态性从较小的类中创建一个非常大的类:

function createTank (gunType) {
    var armour = new Armour();
    armour.hp  = 120;

    var wheels = new ChainTracks();

    var driver = new Soldier();
    driver.hp  = 15;

    var gun = gunFactory(gunType);

    var tank = new Tank(armour,wheels,gun);
    tank.driver = driver;

    return tank; 
}

var ground_tank = createTank("cannon");
var aa_tank = createTank("flak_cannon");
var at_tank = createTank("depleted_uranium_lancer");

如果你有一个像制作一个对象一样简单的工厂,设置它的属性并返回对象,那么确实没有区别.

当您要么使用大量专用组件来使某些东西聚集在一起时(无论它们是注入还是硬编码),或者您正在处理继承,这些差异就会发挥作用.

老实说,我建议在进一步研究这些事情的不同方法之前,先了解这些事情(对象组成和继承).

因为最终,它对完成的代码没有任何影响,如果您使用了工厂,或者您使用了修改通用对象的函数,或者您只是在代码中间使用了大量的类. ..程序会运行得很好,或者会以任何方式切割它.

它确实有所作为的地方在于您如何组织代码以及如何编写代码.
如果你正在做的只是在页面上按一个按钮,你真的不需要工厂.
如果你在你的页面上制作一个功能齐全的MP3播放器,它需要6个按钮,一个播放列表,一个进度条和一个轨道名称,艺术家名称和封面艺术的显示……

…现在是开始研究工厂模式以确定如何将这些部件放在一起,要求一件事,然后让它从成品线上吐出成品的好时机.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...