js高级_118、对象的创建模式

方式一:object构造函数模式

套路:先创建空object对象,再动态添加属性/方法。
使用场景:起始时不确定对象内部的数据。
缺点:语句太多。

	var person=new Object();
	
	person.name='tom';
	person.age=18;
	person.setName=function(name){
		this.name=name;
	}
	
	person.setName("ace");
	console.log(person.name,person.age);



方式二:对象字面量模式

套路:使用{ }创建对象,同时指定属性/方法。
使用场景:起始时对象内部数据是确定的。
缺点:如果创建多个对象,有重复代码。

var person={
	name:"tom",
	age:18,
	setName:function(name){
		this.name=name;
	}
};

person.setName("张三");
console.log(person.name,person.age);

如果创建多个对象,有重复代码。比如:要创建一个person2又要写重复的属性方法
image



方式三:工厂模式

套路:通过工厂函数动态创建对象并返回。函数能返回一个对象,他就是工厂函数。
使用场景:需要创建多个对象。
问题:对象没有一个具体的类型,都是object类型。
这样创建多个对象就不用写重复的代码

function createPerson(name,age){
	var obj={
		name:name,
		age:age,
		setName:function(name){
			this.name=name;
		}
	}
	return obj;
}

//创建2个对象
var p1=createPerson("张三",18);
var p2=createPerson("王五",19);

缺点:创建出来的对象没有具体的类型,比如,再创建一个student的工厂
image
那么,它们都是object类型



方式四:自定义构造函数模式

套路:自定义构造函数,通过new创建对象。
使用场景:需要创建多个类型确定的对象。
缺点:每个对象都有相同的数据,浪费内存。
这样要为实例的对象创建属性必须在其内部加上this关键字。内部的this代表这个函数的实例对象。

	//定义类型
	function Person(name,age){
		this.name=name;
		this.age=age;
		this.setName=function(name,age){
			this.name=name;
		}
	}
	
	//创建实例
	var p1=new Person("张三",18);	
	
	//创建实例
	var p2=new Person("李四",20);
	
	console.log(p1,p2)

这样就能创建不同类型的对象
image

缺点就是他们中的方法浪费内存,因为每个对象都有一个,对象里的方法都是单独的存在的。
image



方式五:构造函数+原型的组合模式

套路:自定义构造函数,属性在函数中初始化,方法添加到原型上。
使用场景:需要创建多个类型确定的对象。

		//定义类型
	function Person(name,age){//在构造函数中只初始化一般属性
		this.name=name;
		this.age=age;	
	}
	Person.prototype.setName=function(name,age){
			this.name=name;//this是实例对象。
		}
	
	//创建实例
	var p1=new Person("张三",18);	
	
	//创建实例
	var p2=new Person("李四",20);
	
	console.log(p1,p2)
	

image

posted @ 2022-03-15 11:09  青仙  阅读(37)  评论(0编辑  收藏  举报