构造函数模式
ECMAScript中的构造函数可用来创建特定类型的对象;有原生构造函数(如
Object,Array等),自定义的构造函数;代码实例
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function() { alert(this.name); }; } // 使用 var yangfch3 = new Person('yangfch3', 21, 'UIDev');使用构造函数的几点特殊之处
- 没有显式地创建对象
- 直接将属性和方法赋值给
this - 没有
return语句
约定俗成:构造函数始终都应该以一个大写字母开头,以示和其他函数的区别;
要创建一个类型的新实例,必须使用
new操作符;以
new+ 构造函数 的方法创建对象的详细步骤- 创建一个新对象
- 将构造函数的作用域赋给新对象(因此
this也就指向了这个新对象) - 执行构造函数中的代码
- 返回新对象
同一个类型(构造函数)生成的实例都会有一个
constructor属性指向构造函数之后我们会指导,其实
constructor是在构造函数的原型上确定的可以使用
instanceof操作符检验对象的类型;本质上
instanceof的检测是原型链上construtor属性的上溯查找
1. 将构造函数当做函数
构造函数也是函数,特殊性是
new操作符带来的;任何函数,只要通过
new操作符调用,那么它就可以作为构造函数;而任何函数,如果不通过new操作符来调用,那么和普通函数并无二致。构造函数如果被当做普通函数一样调用(无
new操作符时),属性和方法会被全部添加到全局对象上。
2. 构造函数模式的优缺点
优点:
- 解决了创建同类型代码复用的问题
- 解决了每个对象的类型归属问题
缺点:
- 每个方法都要在实例上重新创建一遍
每个方法都指向一个匿名函数,每新建一个实例,就会多创建一个匿名函数,然而这两个匿名函数完成的任务确实一样的,方法与内存的复用性较低1。
- 每个方法都要在实例上重新创建一遍
3. 解决方法复用性的拆东墙补西墙的方法
将对象的方法(函数)定义在全局变量里(构造函数外部),这样全局作用域里的函数由每个实例对象所共享,这样就达到了方法(函数)的复用。
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
}
// 将方法(函数)挪到构造函数外
var sayName = function() {
alert(this.name);
}
// 实例共享方法
var person1 = new Person('yangfch3', 21, 'UIDev');
person1.sayName(); // 'yangfch3'
存在的缺陷:
- 全局作用域变得名副其实(在全局作用域定义的函数只能被对象实例调用);
- 当对象的共享方法一多,全局作用域污染明显;
- 毫无封装性可言,代码毫无美感。
1. 理解每个实例都包含一个不同的匿名函数↩
