一、动态原型模式
在中篇讲到构造函数模式和原型模式的组合使用解决了一些实际问题,然而在其他OO语言的开发者看来,这种独立的构造函数和原型很是困惑。为解决这一问题又衍生了动态原型模式。
动态原型模式将所有的信息都封装在构造函数中,在构造函数中初始化原型,这样保持了构造函数模式和原型模式组合使用的优点。
function Person(name, age) {
this.name = name;
this.age = age;
if (typeof this.sayName != 'function') {
Person.prototype.sayName = function () {
console.log(this.name);
}
}
}
注意if语句,只有在sayName方法不存在的时候,将其添加到原型中,这段代码只会在初次调用构造函数时执行,并反映到各个实例当中。
二、寄生构造函数模式
在有些特殊的场景(随后介绍),其他的几种模式都不适合,可以考虑寄生构造函数模式;
基本思想:创建一个函数,该函数的作用是封装创建对象的代码,然后返回新创建的对象;
举个例子:
function Person(name) {
var o = new Object();
o.name = name;
o.sayName = function () {
console.log(this.name);
};
return o;
}
var person1 = new Person('Bob');
person1.sayName();//Bob
创建实例时除了使用new操作符以外,和工厂模式完全相同;
构造函数在不指明返回值的时候,默认返回一个新实例,这里写了return语句,指明需要返回的值;
应用场景:
比如我们需要创建一个具有特殊方法的数组时,由于不能直接修改Array的构造函数,那么就可以考虑用这个模式;
注: 用寄生构造函数模式创建的对象与构造函数和原型对象之间没有关系