对象封装

		/*
		 * JavaScript不区分类和实例的概念,是通过原型(prototype)来实现面向对象编程
		 * 类:类是对象的类型模板,比如定义Student类来表示学生,但是它不代表任何具体的学生
		 * 实例:实例是根据类创建的对象,比如根据Student类,可以创建出“小米”,“小明”等多个
		 * 实例,每一个实例代表一个学生,这些实例全部属于Student类
		 */
		//创建对象
		var obj = new Object();
		obj.name ="小明";//静态是属性
		obj.age = "在荒岛";
		obj.run = function(){//动态是方法
			return this.name+this.age+"跑毒。。。";//this在对象里面,指向对象的实例
		}
		console.log(typeof obj,obj);
		console.log(obj.run());
		
		//工厂函数:为了解决类型对象声明的问题,也是为了解决实例化对象产生大量代码重复的问题
		function createObj(name,age){
			var obj1 = new Object();
			obj1.name = name;
			obj1.age = age;
			obj1.run = function(){
				return this.name+this.age+"在跑毒。。。";
			}
			return obj1;
		}
		var create_obj = createObj("高组长","唱,跳");
		var create_obj1 = createObj("海哥","篮球,rap");
		console.log(create_obj,create_obj1);
		console.log(create_obj instanceof createObj);
		/*
		 * 工厂模式的问题:
		 * 1.创建不同的对象,其中的属性和方法都会重复创建,消耗内存
		 * 2.会产生函数识别问题
		 * 注意事项:
		 * 1.用函数将所有内容都打包起来,按照需求传入形参
		 * 2.函数内部必须返回对象
		 */
		
		/*
		 * 构造函数
		 * 构造函数的方法的规范:
		 * 1.函数名和实例化构造名相同且大写(非强制性,有助于区分构造函数个普通函数)
		 * 2.通过构造函数创建对象,必须使用关键字new
		 * 构造函数和普通函数的区别:
		 * 使用关键字new是构造函数,没有是普通函数
		 */
		function Obj(name.age){
			this.name = name;
			//this代表当前作用域对象的引用,如果在全局范围,指向的是window对象,如果在构造函数体内,指向的是构造函数所声明的对象
			this.age = age;
			this.run = function(){
				return this.name+this.age+"在上课";
			}
		}
		var obj2 = new Obj("小黑",30);
		var obj3 = new Obj("小红",32);
		console.log(obj2.run());
		console.log(obj3.run());
		console.log(obj3 instanceof Obj);//true 识别函数是否为对象的实例
		console.log(obj2===obj3);//false 同一个构造函数的实例之间无法共享属性和方法
		/*
		 * 构造函数解决了工厂函数遗留的函数识别的问题,没有解决内存消耗的问题,同时还带了新的this指向
		 * 的问题
		 * 
		 * 构造函数创建的执行过程
		 * 1.当使用了构造函数,并且使用new 构造函数(),就会在后台执行new Object()
		 * 2.将构造函数的作用域只给新的对象(也就是用过new Object()创建出来的实例),函数体内this就代表当前被创建出来的实例
		 * 3.执行构造函数体内的代码
		 * 4.返回新对象
		 */
发布了31 篇原创文章 · 获赞 32 · 访问量 1269

猜你喜欢

转载自blog.csdn.net/weixin_45936690/article/details/104607432