如果我们想再创建一个面向对象的程序呢?
var obj = new Object(); //创建一个空白对象 obj.name = '张三’; //属性 obj.showName = function(){ //方法 alert(this.name); } obj.showName(); //张三 var obj2 = new Object(); //创建一个空白对象 obj2.name = '李四’; //属性 obj2.showName = function(){ //方法 alert(this.name); } obj2.showName(); //李四
创建是创建好了,但是我们可以看到有很多重复的代码,按照我们平时的做法,这时候怎么办呢?封装成一个函数呗,对,就这么干
function createPerson(name){ var obj = new Object(); obj.name = name; obj.showName = function(){ alert(this.name); } return obj; } var p1 = createPerson('张三'); p1.showName(); //张三 var p2 = createPerson('李四'); p2.showName(); //李四
我们把面向对象的封装函数叫做工厂方式,其实就是封装函数,只不过是起了一个文雅的名字,它为什么叫工厂方式,因为它的步骤特别像一个工厂的流水线
function createPerson(name){ //原料 var obj = new Object(); //加工 obj.name = name; obj.showName = function(){ alert(this.name); } //出厂 return obj; } var p1 = createPerson('张三');
p1.showName(); //张三
var p2 = createPerson('李四');
p2.showName(); //李四
是不是还挺形象的,哈哈哈
但是,到现在为止,它还是和我们的系统对象有些差别的,我们来看一个系统对象
var arr = new Array();
差别1:我们的构造函数首字母没有大写
差别2:我们写的程序没有new关键字
我们首先改首字母的大写,这个好改
function CreatePerson(name){ //原料 var obj = new Object(); //加工 obj.name = name; obj.showName = function(){ alert(this.name); } //出厂 return obj; } var p1 = CreatePerson('张三'); p1.showName(); //张三 var p2 = CreatePerson('李四'); p2.showName(); //李四
在来看这个new,加上new之后,构造函数中的this指向就变了,由原来的window变成了创建出来的对象,在这个例子中,this就指的是obj,而且函数的返回值就是this了
function CreatePerson(name){ this.name = name; this.showName = function(){ alert(this.name); } } var p1 =new CreatePerson('张三'); p1.showName(); //张三 var p2 =new CreatePerson('李四'); p2.showName(); //李四
其中的createPerson被我们称之为构造函数,是因为它是来创建对象的,所以称之为构造函数。