寄生构造函数模式
这种模式的基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象,跟工厂模式很像,但是这里是使用 new 操作符并把使用的包装函数叫做构造函数
function Person(name, age, job) {
var o=new Object();
o.name = name;
o.age = age;
o.job = job;
o.getName=function(){
console.log(this.name);
}
return o;
}
var per=new Person("zw",21,"student");
per.getName();//zw
这个模式可以在特殊的情况下用来为对象创建构造函数。假设我们想创建一个具有额外方法的特殊数组,由于不能直接修改 Array 构造函数,因此可以使用这个模式。
function SpecialArray(){
//创建数组
var values=new Array();
//添加值
values.push.apply(values,arguments);
//添加方法
values.toPipedString=function(){
return this.join("|");
};
return values;
}
var colors=new SpecialArray("blue","red","black");
console.log(colors.toPipedString());//blue|red|black
构造函数返回的对象与在构造函数外部创建的对象没有什么不同。为此,不能依赖 instanceof 操作符来确定对象类型。
console.log(colors instanceof SpecialArray);//false
稳妥构造函数模式
稳妥对象: 没有公共属性,而且其方法也不引用 this 的对象。
稳妥对象最适合在一些安全的环境中(这些环境中会禁止使用 this 和 new ),或者在防止数据被其他应用程序(如 Mashup
程序)改动时使用。
稳妥构造函数遵循与寄生构造函数类似的模式,但有两点不同:
1.新创建对象的实例方法不引用 this
2.不使用 new 操作符调用构造函数
function Person(name,age,job) {
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.getName=function(){
console.log(name);
};
return o;
}
var per=Person("zw",20,"student");
per.getName();//zw
在以这种模式创建的对象中,除了使用 getName() 方法之外,没有其他办法访问 name 的值。
与寄生构造函数模式类似,使用稳妥构造函数模式创建的对象与构造函数之间也没有什么关系,因此 instanceof 操作符对这种对象也没有意义。