day15 面向对象

79 阅读3分钟

*****Object: 1、*****继承:父对象的成员(属性和方法),子对象可以直接使用 为什么:代码重用!节约内存空间!提升网站性能! 何时继承:只要多个子对象共用的属性或【方法】,都要集中定义在父对象之中

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

3、*面试题:两链一包:作用域链(查找变量)、原型链(查找属性和方法)、闭包(保护反复使用的局部变量)
	每个对象都有一个属性:.__proto__,可以一层一层的找到每个的父亲,形成的一条链式结构,就称之为叫做原型链
	可以找到所有父对象的成员(属性和方法),作用:查找属性和方法,哪怕自己没有
	最顶层的是Object的原型,上面放着一个我们眼熟的toString,怪不得人人都可以用到toString();
	JS万物皆对象

4、有了原型对象,设置共有属性和共有方法:
	原型对象.属性名=属性值;
	原型对象.方法名=function(){};

***继承具有非常多的鄙视题:
	1、判断是自有还是共有:
		1、判断自有:obj.hasOwnProperty("属性名");
			true->自有	false->没有或共有
		2、判断共有:
			if(obj.hasOwnProperty("属性名")==false&&"属性名" in obj){
				//in会自动在obj的原型链上进行查找,如果找到了结果为true,如果没找到结果为false
			}

		公式:
			if(obj.hasOwnProperty("属性名")){
				//自有
			}else{
				if("属性名" in obj){
					//共有
				}else{
					//没有
				}
			}

	2、修改/删除自有和共有:
		修改和删除自有:
			修改:obj.属性名=新值
			删除:delete obj.属性名;

		修改和删除共有:一定要找到原型对象做操作,千万不要在本地做操作,修改(添加了一个同名属性),删除(无效果)
			修改:原型.属性名=新值
			删除:delete 原型.属性名;

	3、如何为老IE的数组添加indexOf方法,而且这道题不是固定的,可能是为一类人添加方法
		if(Array.prototype.indexOf===undefined){
			//老IE,加这句话是为了性能:主流浏览器有这个方法,完全不需要我去创建,我这一拖代码只希望老IE用上
			Array.prototype.indexOf=function(key,starti){
				starti===undefined&&(starti=0);
				for(var i=starti;i<this.length;i++){
					if(this[i]==key){
						return i;
					}
				}
				return -1;
			}
		}
		更多的案例见:07鄙视-为老IE的数组添加indexOf方法.html

	4、如何判断x是不是一个数组:千万别用typeof(),只能检查原始类型,不能检查引用类型
		4种:
		1、判断x是不是继承自Array.prototype
			Array.prototype.isPrototypeOf(x);
			//true - 说明是数组		false - 说明不是数组
		
		2、判断x是不是由构造函数Array创建出来的
			x instanceof Array;

		3Array.isArray(x); - ES5提供的,只要是ES5+,老IE都不支持,此方法只有数组可用

		4、输出【对象的字符串】形式
		     在Object的原型上保存着最原始的toString方法
		     原始的toString输出形式:[object 构造函数名]
		     ***多态:子对象觉得父对象的成员不好用,在本地定义了同名成员,相当于覆盖了父对象的成员。
		     不严格的说法:同一个函数名,不同的人来使用,出现的效果是不一样的
		     固定套路:借用:Object.prototype.toString.apply(x); === "[object Array]" 说明一定是数组

	5、实现自定义继承:
		1、两个对象之间设置继承
			子对象.__proto__=父对象;

		2、批量设置继承:
			构造函数名.prototype=父对象;
			时机:先继承,再创建。

作业: 1、轮播、选项卡 - 面向对象开发方式 2、5道鄙视