疑惑:寄生构造函数模式和工厂模式有什么区别?
//构造函数模式
//一般首字母为大写
function JOJO(_name) {
this.name = _name;
this.age = 18;
this.say = function (msg) {
console.log(msg);
}
}
//工厂模式
//一般为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,请见谅~