寄生构造函数模式小记

202天前 · 代码 · 235次阅读

疑惑:寄生构造函数模式和工厂模式有什么区别?

//寄生构造函数模式
//一般首字母为大写
function JOJO(_name) {
    let p = {};
    p.name = _name;
    p.age = 18;
    p.say = function (msg) {
        console.log(msg);
    }
    return p;
}

//工厂模式
//一般为createXX形式
function createJOJO(_name) {
    let p = {};
    p.name = _name;
    p.age = 18;
    p.say = function (msg) {
        console.log(msg);
    }
    return p;
}

//通过寄生构造函数的方式来实例化对象
let jotaro = new JOJO('jotaro');

//通过工厂模式来实例化对象
let jostar = createJOJO('jostar');

寄生构造函数模式主要用于给已有的构造函数添加一些额外内容,不是广泛使用的方式。


我对寄生构造函数模式的理解。
寄生构造函数指将新的构造函数寄生于已有构造函数。在上面的代码中,JOJO()构造函数实际上寄生于Object()构造函数,并为已经生成的object对象添加额外属性。
假如我现在有一个基础的JOJO()

function JOJO(_name) {
    this.name = _name;
}

JOJO.prototype.say = function (msg) {
    console.log(msg);
}

let jonathon = new JOJO('jonathon');

现在我想给JOJO拓展一个stand属性,但是我不想直接修改这个JOJO(),因为我在别的地方还要用到这个原始一点的JOJO()构造函数。这个时候除了实例化出来之后手动添加stand属性,我还可以使用寄生构造函数模式来简化。

function JOJOWithStand(_name, _stand) {
    let jojo = new JOJO(_name);
    jojo.stand = _stand;
    return jojo;
}

let jostar = new JOJOWithStand('jostar','食堂泼辣酱');

实际上也就是帮你封装了那一步jojo.stand = _stand;而已。
如果想要拓展的不是属性而是方法的话,可能寄生构造函数模式还是欠妥的,在该模式下只能对每一个对象重复实例化新方法,导致内存利用率低下。而直接修改原型的话又会导致原构造函数也跟着改变。

《红宝书》中在这里还有一段耐人寻味的话:

除了使用 new 操作符并把使用的包装函数叫做构造函数之外,这个模式跟工厂模式其实是一模一样的。构造函数在不返回值的情况下,默认会返回新对象实例。而通过在构造函数的末尾添加一个 return 语句,可以重写调用构造函数时返回的值。

构造函数(使用new的方式来实例化)没有return语句,他会将自身的指针this返回。而寄生构造函数也是用new,但是显式return了新的对象,导致原本应该隐式返回的this被忽略,变量得到了新对象的指针。
这会不会也是寄生的另一层意思呢?

写得有点乱QWQ,请见谅~

👍 6

js 构造函数

最后修改于202天前

评论

贴吧 狗头 原神 小黄脸
收起

贴吧

狗头

原神

小黄脸

目录

avatar

季悠然

寻找有趣的灵魂

127

文章数

1954

评论数

3

分类

好热啊

arknights!

满纸荒唐言,一把辛酸泪,都云作者痴,谁解其中味。

曹雪芹

107