有了前面两篇文章的基础后,我们来谈一谈在JS中创建对象的几种方式。
建议大家先预习下先前的两篇博客:
稳扎稳打JavaScript(一)——作用域链
稳扎稳打JavaScript(二)——图解对象内存模型
在JS中,创建对象的方式有很多,而且各有千秋,我们需要根据实际的业务需求选择不同的方式。
1. 工厂模式
这是创建对象最为简单的方式。
1.1. 定义方式
工厂模式的思想是:将对象构建的过程封装在一个函数中。这个函数能创建一个对象,并为他进行初始化赋值,最后返回这个对象。若要新建对象,调用这个工厂函数即可。
// 工厂函数
function createPerson ( name, age ) {
var object = new Object();
object.name = name;
object.age = age;
object.getName = function(){
return object.name;
}
return object;
}
1.2. 对象创建方式
// 创建对象
Person perosn = createPerson("柴毛毛", 18);
1.3. 优点
这种模式唯一的优点就是逻辑简单。
1.4. 缺点
- 创建的对象都是Object类型,没办法知道它的确切类型。
- 对象中所有的函数都需要重复定义,浪费内存。
- 没办法创建该类型的公共属性。
2. 构造函数模式
2.1. 定义方式
function Person( name, age ) {
this.name = name;
this.age = age;
this.getName = function(){
return this.name;
};
}
- 这种模式需要创建一个构造函数;
- 构造函数首字母必须大写,这已经成为不成文的规定,目的是为了提高代码的可读性,只要一看到大写的函数那就说明这是一个构造函数;
- 构造函数中,this就代表即将创建的那个对象;
- 对象的属性直接绑在this上;
- 若构造函数中存在闭包,那么闭包中的this仍然指向即将创建的这个对象。
2.2. 对象创建方式
通过new来创建对象:
var person = new Person("柴毛毛",18);
- JS中的new关键词是专门用来创建对象的,不要以为它多么高级,其实通过new创建对象的过程本质上只是执行了这个构造函数,不过比执行普通函数多加了几个步骤:
- 在函数执行前创建一个对象,并将函数的this指向这个对象;
- 然后正常执行函数代码;
- 最后自动返回这个对象;
2.3. 构造函数模式创建对象的过程
2.3.1. 当外层函数执行结束后:
当构造函数所在的外层函数执行结束后,JS引擎就会为这个构造函数创建两样东西:
- 创建一个构造函数本身的函数对象(暂且叫他A)
- 创建构造函数的原型对象(暂且叫他B)
原型对象B中只有一个constructor属性,指向构造函数对象A;A对象中有一个prototype属性,指向对象B。
这个过程结束后,内存中会产生两个与构造函数相关的对象,分别是构造函数对象 和 构造函数的原型对象,他们之间通过属性constructor和