js的常用设计模式

218 阅读3分钟

在我们编写代码的过程中,如果我们考虑使用一些设计模式,可以使我们的代码更加具有可读性和健壮性。接下来整理一些js常用的设计模式:

一、工厂模式

使用简单的函数创建对象,为对象添加属性和方法,然后返回对象

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; // 这里将对象return回来
}
var person1 = createPerson("Nicholas",29,"Software Engineer");
var person2 = createPerson("Greg",27,"Dector");

二、构造函数模式

可以创建自定义引用类型,可以像创建内置对象实例一样使用new操作符。由于函数不局限于任何对象,(即在对象具有松散耦合的特点),因此没有理由不在多个对象间共享函数

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

以上两者的不同之处在于:

  • 1、构造函数没有显式地创建对象;
  • 2、构造函数直接将属性和方法赋给this对象
  • 3、构造函数没有return语句 调用构造函数创建实例会经历以下过程:
  • 1、创建一个对象;
  • 2、将构造函数的作用域赋给新对象(因此this就指向了这个新对象);
  • 3、执行构造函数中的代码(为这个新对象添加属性)
  • 4、返回新对象。 注意:以这种方式定义的构造函数是定义在Global对象(在浏览器中是window对象)中的

三、原型模式

  • 原因:每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,用途是包含可以由特定类型的所有实例共享的属性和方法。
  • prototype是通过调用构造函数而创建的那个对象实例的原型对象。
  • 特点:使用构造函数的prototype来指定那些应用共享的属性和方法。组合使用构造函数模式和原型模式时,使用构造函数定义实例属性,而使用原型定义共享的属性和方法。
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();

var person2 = new Person();
person2.sayName();
alert(person1.sayName == person2.sayName); //true Person.prototype.constructor指向Person.

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

里面既有构造函数的定义对象模式,也有使用prototype的原型形式

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("Grep",27,"Doctor");

person1.friends.push("Van");

五、动态原型模式

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");
firend.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();

七、稳妥构造函数模式

没有公共属性,其方法也不引用this的对象

function Person(name,age,job){
    //创建要返回的对象
    var o = new Object();
    //添加方法
    o.sayName = function(){
        alert(name);
    }
    //返回对象
    return o;
}
var friend = Person("Nicholas",29,"Software Engineer");
friend.sayName();

以上,就是常用的7种js设计模式