创建对象:
单体模式:
实例化Object()就可以得到一个对象,然后在给它添加方法和属性:
1 | var person = new Object(); |
2 | person.name = "Nicholas" ; |
4 | person.job = "Software Engineer" ; |
5 | person.sayName = function (){ |
缺点:在web应用中,一旦大面积以这种单体方式创建对象,重复的代码会爆增。
工厂模式:
用一个函数来进行包装,在函数体内创建一个单体对象,接着就是添加属性和方法,最后该函数返回这个单体对象。
01 | function createPerson(name,age,job){ |
07 | o.sayName = function (){ |
14 |
var person1 = new createPerson( 'samir' ,24, 'front-end-engineer' ); |
15 |
var person2 = new createPerson( 'Greg' ,27, 'Doctor' ); |
缺点:每个对象的constructor都是Object,也无法用instanceof判断,更别说prototype上的方法或属性的共享了。
构造函数模式:
构造函数的定义和上边的createPerson的定义主要不同点:
- 没有在内部显示的创建对象
- 直接将属性和方法赋给了this对象
- 没有return语句
1 | function Person(name, age, job){ |
5 | this .sayName = function (){ alert( this .name);} |
内部执行步骤:
- 创建一个对象
- 构造函数的作用域赋给新对象,this指向这个新对象
- 执行构造函数中的代码
- 返回新对象
这样,每次实例化都会产生一个新对象,这些新对象都是独立的。且都具有constructor属性(指向构造函数的原型对象的constructor)。
缺点:重复的定义构造函数内的方法,例子中的sayName方法。因为在js中,函数就是对象,一个函数是由new Function();来实例化的。
构造函数和一般函数的区别
区别就是调用的方式不同,构造函数如果不是new方式调用,那么和普通函数几乎一样,内部的this指向的是Global对象,在浏览器中就是window。