【创建一个对象】
创建对象且给该对象新建属相和方法
var box=new Object();
box.name='lee';
box.age=56;
box.run=function(){
return this.name+this.age+'运行中...';
};
alert(box.run());
以上就新建了一个对象,但此时如果还想新建一个类似的对象,还需写如下代码
box1=box;
box1.name='shuang';
box1.age=18;
box1.run=function(){
return this.name+this.age+'运行中...';
};
alert(box1.run());
如果我还想创建更多的类似于box对象的对象,还得重复上面的代码,不难发现,这样产生了大量的重复代码,且这样是引用类型,box1=box;box1得到的是box的引用,当box1重新赋值时,box的值也改变了,为解决此问题,引出第2中创建对象的方法
【工厂模式创建对象】
function createObject(name,age)
{
var obj=new Object();
obj.name=name;
obj.age=age;
obj.run=function(){
return obj.name+obj.age+'运行中...';
};
return obj;
}
创建新对象
var box1=createObject('lee',18);
var box2=createObject('shuang',22);
调用新对象的方法:
alert(box1.run());
alert(box2.run());
由上面可以看出,工厂模式创建新对象时用的代码远远比第一种方法要少,所以工厂模式的
优点:解决了创建新对象时要写大量的重复代码
缺点:无法识别创建的哪个对象的实例
alert(box1 instanceof Object); //返回ture
alert(typeof box1); //返回object
由上面可得,只能知道box1是object类型,但不知道是具体的哪个对象,又为解决此问题,引出下面的方法
在此个人理解的工厂模式就是:先创建一个方法,该方法的作用是创建对象,且把方法的参数传递给方法里面创建的对象的属性或方法,且把该对象返回,当想创建多个类似的对象时,直接调用该方法传参,即可创建新对象
【构造函数创建对象】
function Box(name,age){
this.name=name;
this.age=age;
this.run=function()
{
return this.name+this.age+'运行中';
};
}
构造函数创建实例对象的方法:
var box1=new Box('lee',20);
var box2=new Box('shuang',18);
优点:
- 解决了重复实例化的问题
- 解决了对象识别的问题
alert(typeof box1); //返回object
alert(box1 instanceof Box); //返回true,由此可知道是实例化的BOX
构造函数的特点:
- 创建对象时必须使用new,否则就是普通函数调用,也是无效的
- 为与普通函数区别,构造函数名首字母大写
与工厂模式的区别:
- 没有使用new Object()创建对象,所以也没有retruen 对象语句
- 直接将属性和方法赋值给this对象
构造函数为什么能创建对象???
因为创建对象一般用new Object(),但构造函数又没有new Object(),那么问题来了,创建的对象从那里来的???执行过程时这样的:
1.当new 构造函数时,后台自动执行了new Object(),这时会将构造函数的作用域赋给新对象,也就是new Object()创建出来的对象,而构造函数体内的this就代表new Object()出来的对象,所以构造函数体内作用域必须写this ,写别的无效
2.执行构造函数内的代码
3.返回新对象(后台直接返回)