您的位置:首页 > Web前端 > JavaScript

JavaScript面向对象(2)——创建对象的工厂模式与构造函数模式

2017-06-25 21:41 776 查看
虽然Object构造函数和对象字面量都可以用来创建单个对象,但是当我们创建多个对象的时候就会产生大量的重复代码。例如:
var user1={
uname:"jack",
age:17,
SayHello:function () {
alert("Hello,my name is: "+this.uname+".I'm "+this.age+" years old.");
}
}

var user2={
uname:"tom",
age:18,
SayHello:function () {
alert("Hello,my name is: "+this.uname+".I'm "+this.age+" years old.");
}
}

var user3={
uname:"rose",
age:16,
SayHello:function () {
alert("Hello,my name is: "+this.uname+".I'm "+this.age+" years old.");
}
}
为了解决创建多个相似对象产生大量重复代码的问题,我们可以使用工厂模式。在javascript中我们可以将创建对象的过程进行抽象,用函数来封装以特定接口创建对象的细节。上面的代码可以这样改写:
function createUser(name,age) {

var obj = new Object();

obj.uname=name;
obj.age=age;

obj.SayHello=function(){
alert("Hello,my name is: "+this.uname+".I'm "+this.age+" years old.");
};

return obj;
}

var user1= createUser("jack",17);
var user2=createUser("tom",18);
var user3=createUser("rose",16);
工厂模式解决了创建多个相似对象的问题,但是却没有解决对象识别的问题。因为这样创建的对象都是Object类型。Object是原声的构造函数,我们也可以自定义构造函数,从而定义自定义对象类型的属性和方法。我们将上面的例子进行修改,代码如下:
function User(name,age) {

this.uname=name;
this.age=age;

this.SayHello=function(){
alert("Hello,my name is: "+this.uname+".I'm "+this.age+" years old.");
};
}

var user1= new User("jack",17);
var user2=new User("tom",18);
var user3=new User("rose",16);

function Student() {

};

user1.SayHello();
alert(user1 instanceof Object);
alert(user1 instanceof User);
alert(user1 instanceof Student);
我们可以看到,使用构造函数模式与使用工厂模式在创建对象时有如下区别:
1,没有显示创建对象
2,直接将属性和方法赋值给this对象
3,没有return语句
此外,按照约定,构造函数名,首字母要大写。创建User的新实例时,需要使用new关键字。
而通过instanceof函数,我们可以看到user1属于Object类型,也属于User类型,但是不属于Student类型。因此构造函数模式即解决了创建多个相似对象的问题,又解决了对象识别的问题。
虽然构造函数模式很好,但是要知道,javascript中,函数也是对象。实际上我们每次创建对象时都会再创建一个SayHello方法。下面这段代码时等价的。

this.SayHello=function(){
alert("Hello,my name is: "+this.uname+".I'm "+this.age+" years old.");
};
this.SayHello= new Function{
alert("Hello,my name is: "+this.uname+".I'm "+this.age+" years old.");
};

而创建两个相同任务的Function实例的确是没有必要的,如果将SayHello这个方法抽离出来,作为全局函数,又会带来新的问题。怎么办呢?留给大家思考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐