Skip to content

寄生构造函数模式 ​

本节目标:理解“寄生构造函数模式”的核心思路,并能把它用于实际开发或面试表达。 寄生(parasitic)构造函数模式的思路是:

  • 创建出一个新的构造函数,这个构造函数创建的实例,除了具有被寄生的构造函数创建的实例的方法外,还有其他方法;
  • 这个新构造函数在内部调用了原生构造函数创建对象,然后在为这个对象增加属性和方法,最后返回这个对象;
  • 新对象快捷地拥有了原生构造函数原型上的方法,还可以添加其他方法,还不改变原生构造函数的原型。

举例如下:

function Person(name, age, job) {
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function () {
console.log(this.name);
}
return o;
}
var friend = new Person('Nichlas', 29, 'Software Engineer');
friend.sayName();

与工厂模式区别:

  • 使用new操作符;
  • 把使用的包装函数叫做构造函数;
  • 此外,包装函数内部创建对象所用的构造函数不一定是Object,也有可能是其它构造函数,我们借用这些构造函数; 用途: 创建构造函数:这样模式可以在特殊的情况下用来为对象创建构造函数。假设我们想创建一个具有额外方法的特殊数组。由于不能直接修改Array构造函数,因此可以使用这个模式。
function SpecialArray() {
//

创建数组

var values = new Array();
values.push.apply(values, arguments);
//

添加方法

values.toPipedString = function () {
return this.join('|');
};
//

返回数组

return values;
}
var colors = new SpecialArray('red', 'blue', 'green');
console.log(colors.toPipedString());//'red|blue|green'

说明: 首先,返回的对象与构造函数或者与构造函数的原型属性之间没有关系; 也就是说,构造函数返回的对象与在构造函数外部创建的对象没有什么不同。

为此,不能依赖instanceof操作符来确定对象类型。 由于存在上述问题,我们建议在可以使用其它模式的情况下,不要使用这种模式。

本站总访问 — 次