1),Object构造函数创建
var User = new Object
User.name = 'xiu'';
User.age = 18;
2),使用对象字面量表示法
var User = {}; //相当于 var User = new Object();
var User = {
name:'xiu',
age:'18',
}
对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象过程,也就是说,第一和第二种方式创建对象的方法其实是一样的,只是写法上的区别不同,
这样创建对象的缺点是:它们都是用了同一个借口创建很多对象,会产生大量的重复代码,如果你有100多个对象,那你要输入100次很多相同的代码.那么我们有什么办法来避免过多的重复代码呢,就是把创建对象的过程封装在函数体内,通过函数的调用直接生成对象.
3),使用工厂模式创建对象
function createUser(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(o.name);
};
return o;
}
var user1 = createUser('xiu',18,'programmer');
console.log(user1)
便携一个构造函数,并通过new方式来创建对象实例,构造函数本可以带有构造参数
例如:
function User(name,age,job){
this.name = name,
this.age = age,
this.job = job
}
var user1 = new User(18,'xiu','programmer')
console.log(user1);
对比工厂模式,我们可以发现以下区别:
1,没有显示地创建对象
2,直接将属性和方法赋给了this对象
3,没有return语句
4,终于可以识别的独享类型.对于检测对象类型,我们应该使用instanceof操作符
console.log(user1 instanceof Object) //true
console.log(user1 instanceof User) //true
而使用工厂模式时:
var User = function(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
return o
};
var user1 = User('xiu',18,'programmer')
console.log(user1);
console.log(user1 instanceof Object) //true
console.log(user1 instanceof User) //false
那么,构造函数确实挺好用,但是它也有它的缺点:
就是每个方法都要在每个实例上重新创建一遍,方法指的就是我们爱对象里定义的函数,如果方法数量很多,就会占用很多不必要的内存.于是出现了第五种创建对象的方法:
5)原型创建对象模式
function User(){}
User.prototype.name = 'xiu';
User.prototype.age = '18';
User.prototype.job = 'programmer'
var user1 = new User()
console.log(user1.name+user1.age+user1.job); //xiu18programmer
console.log(user1 instanceof User); //true
var user2 = new User()
user2.name = 'ake'
user2.job = 'girlFriend'
console.log(user2.name+user2.age+user2.job) //ake18girlFriend
console.log(user2 instanceof User)//true
可以看到,如果使用原型创建对象的方式,可以让所有对象实例共享它所包含的属性和方法,
并且,当为对象实例添加一个属性时,如果实例的原型中拥有这个同名属性,这个属性就会屏蔽原型对象中保存的同名属性.
这个时候我们就可以使用构造函数模式与原型模式结合的方式,构造函数模式用于定义实例属性和方法,原型创建模式用于定义共享的属性和方法
6)构造函数模式+原型模式
function User(name,age,job){
this.name = name,
this.age = age,
this.job = job
}
User.prototype = {
sayName:function(){
alert(this.name)
}
}
var user1 = new User('xiu',18,'programmer')
console.log(user1)
user1.sayName();
var user2 = new User('ke',18,'girlFriend')
user2.sayName();