Object 15天

54 阅读3分钟

1、*****Object:

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

2、***如何找到父对象(原型对象):保存一类子对象共有属性和共有方法的父对象:21、子对象.__proto__;//前提:必须先有一个对象
	2、构造函数名.prototype;//构造函数名,几乎人人都有,除了Math/Undefined/Null

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

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

	***笔试题1:判断自有和共有:
		1、判断自有:
			obj.hasOwnProperty("属性名");
				如果结果为true,说明一定是自有,如果结果为false,可能是共有可能是没有
		2、判断共有:
			if(obj.hasOwnProperty("属性名")==false&&"属性名" in obj){//in 会自动在整条圆形脸上进行查找,找到结果为true,找不到结果为false
				说明是共有
			}else{
				说明是没有
			}

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

	***笔试题2:修改/删除自有和共有
		自有:修改:obj.属性名=新值;
		           删除:delete obj.属性名;
		
		共有:修改:obj.__proto__.属性名=新值;
		           删除:delete obj.__proto__.属性名;

			共有千万不要操作本地:
				修改:会在本地添加同名属性
				删除:没有效果

	***笔试题3:如何为老IE的数组添加indexOf方法:如何为一类人添加某个方法
		原理:
		if(Array.prototype.indexOf===undefined){//老IE
			Array.prototype.indexOf=function(key,starti){
				starti===undefined&&(starti=0);
				for(var i=starti;i<this.length;i++){
					if(key==this[i]){
						return i;
					}
				}
				return -1;
			}
		}

	***笔试题4:判断x是不是一个数组:4种方式
		1、判断x是不是继承自Array.prototypeArray.prototype.isPrototypeOf(x);

		2、判断x是不是由Array这个构造函数创建的
			x instanceof Array

		3、只有数组可用:ES5提供的一个叫Array.isArray(x);

		4、最麻烦:输出【对象的字符串】形式
		     在Object的原型上保存着最原始的toString方法
		     最原始的toString方法输出:[object 构造函数名]
		     ***多态:子对象觉得父对象的成员不好用,在本地定义了同名成员,覆盖了父对象的成员
		     如果我们这道题能够跳过数组的爸爸,拿到数组的爷爷上面的toString也就能判断了
		     固定套路:借用:Object.prototype.toString.apply(x);
		
	***笔试题5:实现自定义继承:
			1、两个对象之间的继承:
				子对象.__proto__=父对象
		
			2、多个对象之间设置继承:
				构造函数名.prototype=父对象
				注意时机:一定要在创建对象之前

作业: 1、面向对象版 - 选项卡 2、面向对象版 - 轮播 3、面向对象版 - 购物车 4、每一道笔试题做一次