Appearance
寄生构造函数模式
本节目标:理解“寄生构造函数模式”的核心思路,并能把它用于实际开发或面试表达。 寄生
(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操作符来确定对象类型。 由于存在上述问题,我们建议在可以使用其它模式的情况下,不要使用这种模式。
