zoukankan      html  css  js  c++  java
  • 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);
    			}
    			//这种方式很不好啊,污染全局不说,没有封装性啊
    			
    			//所以下篇文章我会用原型链来解决这个问题
    			
    

      

      

  • 相关阅读:
    numpy中linspace用法 (等差数列创建函数)
    Ubuntu环境下 matplotlib 图例中文乱码
    转载: 广义逆矩阵
    matplotlib.pyplot中add_subplot方法参数111的含义
    转载:(论文) 二次指数平滑法中确定初始值的简便方法
    图像处理之 opencv 学习---opencv 中的常用算法
    图像处理之 opencv 学习---矩阵的操作
    编译异常之static和extern---more than one storage class specified
    格式转换至yuv422转 yuv420
    阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_6 自定义类型转换器代码编写
  • 原文地址:https://www.cnblogs.com/xudy/p/5418556.html
Copyright © 2011-2022 走看看