一、构造函数模式和原型模式的组合使用

创建自定义类型的最常用方式

function Person(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    this.friends=["Shelly","Court"];
}
Person.prototype={
    constructor:Person,
    sayName:function(){
    console.log(this.name);
}
};
var person1=new Person("Nicholas",29,"Software Engineer");
var person2=new Person("Greg",21,"Doctor");
person1.friends.push("Ken");
console.log(person1.friends);//[ 'Shelly', 'Court', 'Ken' ]
console.log(person2.friends);//[ 'Shelly', 'Court']
console.log(person1.friends===person2.friends);//false
console.log(person1.sayName===person2.sayName);//true

二、动态原型模式

构造函数模式与原型模式结合并关联。

通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型。如下面的例子:

function Person(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    if(typeof this.sayName!="function"){
        Person.prototype.sayName=function(){
            console.log(this.name);
        }
    }
}
var friend=new Person("Nicholas",29,"Software Engineer");
friend.sayName();//"Nicholas"

三、寄生构造函数模式

工厂模式和构造函数模式的结合。相当于用工厂模式重写调用构造函数时返回的值。

经典例子:

function SpecialArray(){
    //创建数组
    var values=new Array();
    //添加值
    values.push.apply(values,arguments);
    // values.push(arguments);
    //添加方法
    values.toPipedString=function(){
        return this.join("|");
    }
    //返回数组
    return values;
}
var colors=new SpecialArray("red","blue","green");
console.log(colors.toPipedString());//red|blue|green

四、稳妥构造函数模式

该模式是出于安全性考虑

特点:1.新创建对象的实例方法不引用this 2.不使用new操作符调用构造函数

经典例子:

function Person(name,age,job){
    //创建要返回的对象
    var o=new Object();
    //定义私有变量和函数
    var name=name;
    //添加方法
    o.sayName=function(){
        console.log(name);
    };
    //返回对象
    return o;
}
var friend=Person("Nicholas",28,"Software Engineer");
friend.sayName();//Nicholas
console.log(friend.name);//undefined

变量friend中保存的是一个稳妥对象,除了调用sayName()方法外,没有别的方式可以访问其数据成员。

10-07 10:37