1.工厂模式

例子:

function createPerson(name,age){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.sayName = function () {
        alert(this.name);
    }
    return o;    
}
var person1 = createPerson("EvanChen",18,"Software Engineer");//创建一个对象

问题:没有解决对象识别问题

    alert(person1 instanceof createPerson)//fasle 会发现其实并不存在一个createPerson类

2.构造函数模式

例子:

    function Person(name,age){
        this.name = name;
        this.age = age;
        this.sayName = function(){
            alert(this.name);
        }
    }
    var p1 = new Person('EvanChen',18);//创建一个Person类

用new操作符调用构造函数经历了以下4个步骤:

  • (1)创建一个新对象

  • (2)将构造函数的作用域赋给新对象

  • (3)执行构造函数中的代码

  • (4)返回新对象

解决了工厂模式兑现识别问题:

alert(typeof(p1));// Person
alert(p1 instanceof(Person));// true

3.原型模式

例子:

    function Person(){        
    }
    Person.prototype.name = "EvanChen";
    Person.prototype.age= 18;
    Person.prototype.sayName= function(){
        alert(this.name);
    }
    
    var p1 = new Person();
    p1.sayName(); //"EvanChen"
    
    var p2 = new Person();
    p2.sayName(); //"EvanChen"
    
    alert(p1.sayName == p2.sayName); //true
    

将所有属性和方法都加在Person的prototype属性中,因此新对象具有相同的属性和方法。

4.组合使用构造函数模式和原型模式(推荐)

例子:

function Person(name,age){
    this.name = name;
    this.age = age;
    this.friends = ["Shelby","Court"];
};

Person.prototype = {
    constructor:Person,
    sayName:function(){
        alert(this,name);
    }
}
//Person.prototype.sayName = function(){
//   return this.name;
//};

var person1 = new Person("EvanChen",18);
var person2 = new Person("Greg",16);

person1.friends.push("Van");
alert(person1.friends);//"Shelby,Court,Van"
alert(person2.friends);//"Shelby,Court"
alert(person1.friends == person2.friends);//false
alert(person1.sayName == person2.sayName );//true

所有实例共享原型中的属性constructor和方法sayName(),相同的属性在构造函数中定义。

5.动态原型模式(推荐)

例子:

function Person(name,age){
    this.name = name;
    this.age = age;
    if (typeof this.sayName != "function"){
        Person.prototype.sayName = function(){
            alert(this.name);
        };
    }
};
var person1 = new Person("EvanChen",18);
person1.sayName();

在sayName()方法不存在的情况下,才会将它添加到原型中,当原型完成初始化后,能够立即在所有实例中得到共享。

6.寄生构造函数模式

基本思想是:创建一个函数,该函数的作用仅仅是封装对象的代码,然后再返回新构建函数的对象
例子:

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");
alert(colors.toPipedString());//red|blue|green

构造函数返回的对象与构造函数外部创建的对象没有什么不同,因此不能依赖instanceof操作符来确定对象类型。

7.稳妥构造函数模式

稳妥对象指的是没有公共属性,而且其方法也不再引用this的对象。稳妥对象最适合在一些安全的环境中,或者防止数据被其他应用程序删改时使用。

例子:

function Person(name, age) {
    //创建要返回的对象
    var o = new Object();
    //定义私有变量和函数
    o.sayName = function (){
        alert(name);
    }
    return o;
}

var person1 = Person("EvanChen", 18);
person1.sayName();//"EvanChen"

在这种模式创建的对象中,除了使用sayName()方法外,没有其他方法访问name的值。


Evan_Chen
130 声望5 粉丝