背景:
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高级程序设计第六章(第三版)