js的创建对象方式

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)



4),构造函数的方法

便携一个构造函数,并通过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();

    




你可能感兴趣的:(js的创建对象方式)