Object 封装对象 面向对象

130 阅读4分钟

1、*****Object:对象 - Array、String、RegExp、Date... 对象具有属性和方法,都是预定义好的,现在我们可以学习自定义对象 - js是基于原型的面向对象语言 面向对象 - 三大特点:封装、继承、多态 1、***开发方式: 面向过程:过程 - 开始 -> 结束,其实我们一直得开发方式都是面向过程:先干什么在干什么最后干什么 面向对象:对象(属性和方法),js里面有一句话万物皆对象,假设一个人是一个对象得话: 属性:身高、体重、姓名、性别、爱好、智商、情商... 方法:吃饭、睡觉、跑步、学习、打字、上课、讲课...

	何时使用面向对象:以后任何操作都要封装在一个对象之中 - 但是新手并不是太友好,难度较大
	为什么要面向对象:现实生活中所有得数据都必须包含在一个事物之中才有意义 - 更符合现实生活

2、*****封装/创建/定义:封装自定义对象:31、*直接量方式:
		var obj={
			"属性名":属性值,
			...,
			"方法名":function(){

			},
			...
		}

		强调:
			1、其实属性名和方法名得""可以不加 - 暂时建议你加上,以后我们要学习一个数据格式JSON,他就必须在键上加上""
			2、访问对象的属性和方法
				obj.属性名	===	obj["属性名"]
				obj.方法名()	===	obj["方法名"]()
				建议使用.去访问对象的属性和方法,更简单
				***js中一切都是对象,除了undefined和null,一切对象的底层都是hash数组
			3、访问到不存在的属性,返回undefined
			4、可以随时随地添加新属性和新方法
				obj.属性名=新值;
				obj.方法名=function(){}
			5、如果我希望遍历出对象所有的东西,必须使用for in循环,必须写为obj[i]才能拿到,不要使用.会出问题
			6、***如果你希望在对象的方法里,使用对象自己的属性,写为this.属性名!
					*****难点:this的指向
						1、单个元素绑定事件this->这个元素
						2、多个元素绑定事件this->当前元素
						3、定时器中的this->window
						4、箭头函数中的this->外部对象
						5、函数中的this->谁在调用此方法,this就是谁
						6、构造函数之中this->当前正在创建的对象

	2、预定义构造函数:
		var obj=new Object();//空对象
		//需要自己后续慢慢添加属性和方法
		obj.属性名=新值;
		obj.方法名=function(){}

	以上两个方法都有一个缺陷:一次只能创建一个对象,适合创建单个对象的时候使用(第一种方法),第二种永远是垃圾,如果你要批量创建多个对象,那么我推荐使用第三种方式

	3、自定义构造函数方式:21、创建自定义构造函数
			function 类名(name,age,hobby){
				this.name=name;
				this.age=age;
				this.hobby=hobby;
			}
			//千万不要再里面创建方法,每个对象都会创建出一个相同的方法,浪费内存 - 学习继承后就可以解决

		2、调用构造函数创建对象
			var obj=new 类名(实参,...)
	
	面向对象:
		优点:
			1、逼格高,所有的属性和方法都保存在一个对象之中 - 更符合现实生活更有意义
			2、每个功能特地分开写 - 便于以后维护
			3、铁锁链舟 - 一个方法触发多个方法联动

		缺点:对新手不友好,尤其是this的指向的问题

3、*****继承:父对象的成员(属性和方法),子对象可以直接使用
	为什么要继承:代码重用!提高代码的复用性,节约了内存空间,网站的性能自然也就提升了
	何时继承:只要多个子对象公用的属性和【方法】,都要集中定义再父对象之中

	1、***如何找到原型对象(父对象):保存一类子对象共有属性和共有方法
		1、对象名.__proto__; //必须先有一个对象
		2、构造函数名.prototype;//构造函数几乎人人都有,除了Math和window,new 构造函数名();//Array、String、Date、RegExp...

	2、*面试题:两链一包:作用域链和【原型链】和闭包
		每个对象都有一个属性:.__proto__,可以一层一层的找到每个人的父亲,形成的一条链式结构,我们就称之为叫做原型链
		可以找到父对象的成员(属性和方法),作用:找共有属性和共有方法,自己没有,会悄悄向上找
		最顶层的是Object的原型,上面放着一个我们眼熟的方法toString(),怪不得人人都可以使用toString
		JS万物皆对象

	3、有了原型对象,可以设置共有属性和共有方法
		1、原型对象.属性名=属性值;
		2、原型对象.方法名=function(){}