js创建对象之工厂模式

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			//创建对象
			//工厂模式
			//ECMAScript无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节
			function createPerson(name , age , job){
				var o = new Object();
				o.name = name;
				o.age = age;
				o.job = job;
				o.sayName = function(){
					return this.name;
				}
				return o;
			}
			var person1 = createPerson("宝清老窖" , 29 , "Software Engineer");
			var person2 = createPerson("金宝清" , 26 , "Doctor");
			console.log(person1);
			console.log(person2);
			console.log('---------------------------');
			//这种模式虽然解决了创建多个相似对象的问题,但是却没有解决对象的识别问题。
			
			//构造函数模式
			function Person(name , age , job){
				this.name = name;
				this.age = age;
				this.job = job;
				this.sayName = function(){
					alert(this.name);
				}
			}
			
			var person1 = new Person("金宝清" , 26 , "快递员");
			var person2 = new Person("宝清老窖" , 29 , "Soft");
			console.log(person1);
			console.log(person2);
			//用Person取代createPerson()函数,不同之处总结
			//1、没有显示地创建对象
			//2、直接将属性和方法赋给了this对象
			//3、没有return语句
			
			//new 一个function的四个步骤
			/*1、创建一个新的对象
			 *2、将构造函数的作用于赋给新的对象(因此this就指向了这个新的对象)
			 *3、执行构造函数中的代码(为这个新对象添加属性)
			 *4、返回新对象
			 * */
			//person1和person2分别保存着Person的一个不同的实例。这两个对象有一个constructor属性,该属性指向Person
			alert(person1.constructor == Person);//true
			alert(person2.constructor == Person);//true
			//检测对象类型用 instanceof
			alert(person1 instanceof Object);//true
			alert(person1 instanceof Person);//true
			alert(person2 instanceof Object);//true
			alert(person2 instanceof Person);//true
			//创建自定义构造函数意味着将来可以将他的实例标示为一种特定的类型;这正是构造函数模式胜过工厂模式的地方
			//person1和person2之所以是Object的实例,是因为所有对象均继承自Object(以后讨论)
			
			//1、将构造函数当作函数
			//构造函数与其他函数的唯一区别,就在于调用他们的方式不同
			//构造函数也是函数不存在特殊语法
			//任何函数,只要通过new来操作符来调用它就可以作为构造函数
			//任何函数,通过函数名来调用就是普通函数
			//构造调用
			var person = new Person("宝清老窖" , 29 , "Software Engineer");
			person.sayName();//宝清老窖
			//普通调用
			Person("宝清老窖" , 29 , "Software Engineer");
			window.sayName();//宝清老窖
			//在另一个对象的作用于中调用
			var o = new Object();
			Person.call( o , "金宝清" , 29 , "Software Engineer")
			o.sayName();
			//2、构造函数的问题
			//用new构造函数时,函数里面的方法每次都要执行一次,因为函数是对象
			function Person(name , age , job){
				this.name = name;
				this.age = age;
				this.job = job;
				this.sayName = new Function("alert(this.name)");//与生命函数在逻辑上是等价的
			}
			//所以new出来的实体对象的sayName不是同一个对象,如:
			var p1 = new Person("宝清老窖" , 10 , "Software");
			var p2 = new Person("金宝清" , 20 , "快递");
			alert(p1.sayName == p2.sayName); // false
			//解决方式是把函数提出来
			function Person(name , age , job){
				this.name = name;
				this.age = age;
				this.job = job;
				this.sayName = sayName;
			}
			
			function sayName(){
				alert(this.name);
			}
			//这种方式很不好啊,污染全局不说,没有封装性啊
			
			//所以下篇文章我会用原型链来解决这个问题
			
		</script>
	</body>
</html>

  提取js

//创建对象
			//工厂模式
			//ECMAScript无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节
			function createPerson(name , age , job){
				var o = new Object();
				o.name = name;
				o.age = age;
				o.job = job;
				o.sayName = function(){
					return this.name;
				}
				return o;
			}
			var person1 = createPerson("宝清老窖" , 29 , "Software Engineer");
			var person2 = createPerson("金宝清" , 26 , "Doctor");
			console.log(person1);
			console.log(person2);
			console.log('---------------------------');
			//这种模式虽然解决了创建多个相似对象的问题,但是却没有解决对象的识别问题。
			
			//构造函数模式
			function Person(name , age , job){
				this.name = name;
				this.age = age;
				this.job = job;
				this.sayName = function(){
					alert(this.name);
				}
			}
			
			var person1 = new Person("金宝清" , 26 , "快递员");
			var person2 = new Person("宝清老窖" , 29 , "Soft");
			console.log(person1);
			console.log(person2);
			//用Person取代createPerson()函数,不同之处总结
			//1、没有显示地创建对象
			//2、直接将属性和方法赋给了this对象
			//3、没有return语句
			
			//new 一个function的四个步骤
			/*1、创建一个新的对象
			 *2、将构造函数的作用于赋给新的对象(因此this就指向了这个新的对象)
			 *3、执行构造函数中的代码(为这个新对象添加属性)
			 *4、返回新对象
			 * */
			//person1和person2分别保存着Person的一个不同的实例。这两个对象有一个constructor属性,该属性指向Person
			alert(person1.constructor == Person);//true
			alert(person2.constructor == Person);//true
			//检测对象类型用 instanceof
			alert(person1 instanceof Object);//true
			alert(person1 instanceof Person);//true
			alert(person2 instanceof Object);//true
			alert(person2 instanceof Person);//true
			//创建自定义构造函数意味着将来可以将他的实例标示为一种特定的类型;这正是构造函数模式胜过工厂模式的地方
			//person1和person2之所以是Object的实例,是因为所有对象均继承自Object(以后讨论)
			
			//1、将构造函数当作函数
			//构造函数与其他函数的唯一区别,就在于调用他们的方式不同
			//构造函数也是函数不存在特殊语法
			//任何函数,只要通过new来操作符来调用它就可以作为构造函数
			//任何函数,通过函数名来调用就是普通函数
			//构造调用
			var person = new Person("宝清老窖" , 29 , "Software Engineer");
			person.sayName();//宝清老窖
			//普通调用
			Person("宝清老窖" , 29 , "Software Engineer");
			window.sayName();//宝清老窖
			//在另一个对象的作用于中调用
			var o = new Object();
			Person.call( o , "金宝清" , 29 , "Software Engineer")
			o.sayName();
			//2、构造函数的问题
			//用new构造函数时,函数里面的方法每次都要执行一次,因为函数是对象
			function Person(name , age , job){
				this.name = name;
				this.age = age;
				this.job = job;
				this.sayName = new Function("alert(this.name)");//与生命函数在逻辑上是等价的
			}
			//所以new出来的实体对象的sayName不是同一个对象,如:
			var p1 = new Person("宝清老窖" , 10 , "Software");
			var p2 = new Person("金宝清" , 20 , "快递");
			alert(p1.sayName == p2.sayName); // false
			//解决方式是把函数提出来
			function Person(name , age , job){
				this.name = name;
				this.age = age;
				this.job = job;
				this.sayName = sayName;
			}
			
			function sayName(){
				alert(this.name);
			}
			//这种方式很不好啊,污染全局不说,没有封装性啊
			
			//所以下篇文章我会用原型链来解决这个问题
			

  

  

原文地址:https://www.cnblogs.com/xudy/p/5418556.html