2

1、工厂模式


没有解决对象识别的问题(即怎样知道一个对象的类型)

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");

2、构造函数模式


使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一遍。通过把函数定义转移到构造函数外部来解决这个问题

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");
//把函数定义转移到构造函数外部
function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = sayName;
}
function sayName(){
    alert(this.name);
}
var person1 = new Person("Nicholas", 29, "Software Engineer");

如果对象需要定义很多方法,那么就要定义很多个全局函数,于是我们这个自定义的引用类型就丝毫没有封装性可言了。

3、原型模式


原型对象的好处是可以让所有对象实例共享它所包含的属性和方法;
原型模式最大的问题是由其共享的本性导致的:对于那些包含基本值的属性可以通过在实例上添加一个同名属性,可以隐藏原型中的对应属性,但是对于包含引用类型值的属性来说,问题就很突出了。

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();

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

创建自定义类型的最常见方式就是组合使用构造函数模式与原型模式;
构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。

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");

5、动态原型模式

通过检查某个应该存在的方法是否有效来决定是否需要初始化原型;
注意:使用动态原型模式时,不能使用对象字面量重写原型。如果在已经创建了实例的情况下重写原型,那么就会切断现有实例与新原型之间的联系;

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

6、寄生构造函数模式

封装创建对象的代码,然后再返回新创建的对象;
除了使用new操作符并把使用的包装函数叫做构造函数之外,这个模式和工厂模式其实是一模一样的

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");

7、稳妥构造函数模式

稳妥构造函数遵循与寄生构造函数类似的模式,但有两点不同:
(1)新创建对象的实例方法不引用this;
(2)不使用new操作符调用构造函数。

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

    //添加函数
    o.sayName = function() {
        alert(name);      //注意寄生构造函数中是alert(this.name)
    };
    //返回对象
    return o;
}
//注意寄生构造函数中是var friend = newPerson("Nicholas", 29, "Software Engineer"); 
var friend = Person("Nicholas", 29, "Software Engineer");  
friend.sayName();  //"Nicholas"




皮卡丘丘丘
50 声望12 粉丝

不忘初心方得始终,念念不忘必有回响