面向对象——创建对象

193 阅读2分钟

一、工厂模式

工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程。  

function createPerson(name, age, job){    
    var o = new Object();    
    o.name = name;    
    o.age = age;    
    o.job = job;    
    o.sayName = function(){        
        alert(this.name);    
    };    
    return o;
}
var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");

二、构造函数模式

ECMAScript 中的构造函数可用来创建特定类型的对象。像 ObjectArray 这样 的原生构造函数,在运行时会自动出现在执行环境中。此外,也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。

function Person(name, age, job){    
    this.name = name;    
    this.age = age;    
    this.job = job;    
    this.sayName = function(){        
        alert(this.name);    
    };
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor"); 

三、原型模式

function Person(){}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){    
    alert(this.name);
};
var person1 = new Person();person1.sayName(); //"Nicholas"
var person2 = new Person(); 
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName); //true 

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

function Person(name, age, job){    
this.name = name;    
this.age = age;    
this.job = job;    
this.friends = ["Shelby", "Court"];}
Person.prototype = {    
    constructor : Person,    
    sayName : function(){        
        alert(this.name);    
    }
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.friends.push("Van");
alert(person1.friends); //"Shelby,Count,Van"
alert(person2.friends); //"Shelby,Count"
alert(person1.friends === person2.friends); //false
alert(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(){            
            alert(this.name);       
        };    
    }
}
var friend = new Person("Nicholas", 29, "Software Engineer");
friend.sayName(); 

六、寄生构造函数模式

function Person(name, age, job){    
    var o = new Object();    
    o.name = name;    
    o.age = age;    
    o.job = job;    
    o.sayName = function(){        
        alert(this.name);    
    };    
    return o;
}
var friend = new Person("Nicholas", 29, "Software Engineer");
friend.sayName(); //"Nicholas" 

七、稳妥构造函数模式

所谓稳妥对象,指的是没有公共属性,而且其方法也不引用 this 的对象。稳妥对象最适合在一些安全的环境中(这些环境中会禁止使用 thisnew),或者在防止数据被其他应用程序(如 Mashup程序)改动时使用。  

function Person(name, age, job){    
    //创建要返回的对象    
    var o = new Object(); 
    //可以在这里定义私有变量和函数    
    //添加方法    
    o.sayName = function(){        
        alert(name);    
    };    
    //返回对象    
    return o;
}