背景:

  ES6之前,也就是没有class关键字之前,JS一直使用的是函数和原型链结合的方式来创造类,下面就对于一些基本的方式来进行一个整合。

具体方式:

  1. 工厂模式:

 1 function Person(name, age, job) {
 2     var o = new Object()
 3     o.name = name
 4     o.age = age
 5     o.job = job
 6     o.sayName = function () {
 7         alert(this.name)
 8     }
 9     return o
10 }
11 var person1 = Person()
12 var person2 = Person()

 

  缺点:

    ①. 类的共同属性没有被明显区分;例如上面的person1对象和person2对象的sayName方法根本上不是用一个方法;

    ②. 如果使用这种方法创造大量的对象,那么会导致占用大量的内存空间。(因为每一个对象的sayName都占有内存空间)

 

  2. 构造函数模式

 1 function Person(name, age, job) {
 2     this.name = name
 3     this.age = age
 4     this.job = job
 5     this.sayName = function () {
 6         alert(this.name)
 7     }
 8 }
 9 var person1 = new Person()
10 var person2 = new Person()

 

  缺点:(和工厂模式一致)

    ①. 类的共同属性没有被明显区分;例如上面的person1对象和person2对象的sayName方法根本上不是用一个方法;

    ②. 如果使用这种方法创造大量的对象,那么会导致占用大量的内存空间。(因为每一个对象的sayName都占有内存空间)

 

  3. 原型模式

 1 function Person(name, age, job) {
 2     this.name = name
 3     this.age = age
 4     this.job = job
 5 }
 6 Person.prototype = {
 7     constructor: Person,
 8     sayName: function () {
 9         alert("this.name")
10     }
11 }
12 var person1 = new Person()
13 var person2 = new Person()

  特性:

    解决了工厂模式和构造函数模式的问题。

  缺点:

    ①. 原型的公共属性是可以被任意一个原型对象修改的

 

  4. 动态原型模式:该模式个人还不知道其应用场景

 1 function Person(name, age, job) {
 2     this.name = name
 3     this.age = age
 4     this.job = job
 5     if (typeof this.sayName != "function") {
 6         Person.prototype.sayName = {
 7             alert("this.name")
 8         }
 9     }
10 }
11 var person1 = new Person()
12 var person2 = new Person()

 

  5. 稳妥构造函数模式

 1 function Person(name, age, job) {
 2     var o = new Object()
 3     pname = name
 4     page = age
 5     pjob = job
 6     o.sayName = function () {
 7            alert(this.name)
 8     }
 9     return o
10  }
11 var person1 = Person()
12 var person2 = Person()

  特性:

    ①. 这种模式提供了一种创造私有变量的方法,在外层,除了对象暴露的函数,其他方式不能访问变量

  缺点:

    ①. 类的共同属性没有被明显区分;例如上面的person1对象和person2对象的sayName方法根本上不是用一个方法;

    ②. 如果使用这种方法创造大量的对象,那么会导致占用大量的内存空间。(因为每一个对象的sayName都占有内存空间)

 

参考资料:

  1. JavaScript高级程序设计第六章(第三版)