JavaScript day015

77 阅读2分钟

1、*Object继承

Object继承:父对象的成员(属性和方法),子对象可以直接使用
为什么:【代码重用】!节约内存控件,提升网站的性能!
何时继承:只要多个子对象共用的属性和【方法】,都要集中定义再父对象之中,尤其是方法,方法/函数也是一个对象,创建的函数越多性能越差

2、*如何去找到父对象(原型对象)

如何去找到父对象(原型对象)两种:保存一类子对象共有属性和共有方法的

1、对象名.__proto__;//这个方法有一个特点就是必须先有一个对象

2、构造函数名.prototype;//构造函数名:String、Function、Object、RegExp、Array、Date、h52205...,
几乎人人都有,除了undefinednullMath

3、面试题:两链一包:作用域链、闭包、原型链

每个对象都有一个属性:__proto__,可以一层一层的找到每个人的父亲,形成的一条链式结构,我们就称之为叫做原型链
可以找到所有父对象的成员(属性和方法),作用:查找共有属性和共有方法
最顶层是Object的原型,上面放着我们眼熟的toString,怪不得人人都可以toString();
JS万物皆对象

4、有了原型对象,设置共有属性和共有方法

1、原型对象.属性名=属性值;
2、原型对象.方法名=function(){}

添加共有.png

笔试题

1、判断自有还是共有

	1、判断自有:obj.hasOwnProperty("属性名");
		如果结果为true,说明是自有属性,如果结果为false,有两种可能:共有或没有
	2、判断共有:
		if(obj.hasOwnProperty("属性名")==false&&"属性名" in obj){//in自动去整条原型链上进行查找
			console.log("共有")
		}else{
			console.log("没有")
		}

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

笔试题判断共有自有.jpg

2、修改/删除 自有和共有

自有:修改:obj.属性名=新属性值;
	          删除:delete obj.属性名;

共有:修改:原型对象.属性名=新属性值; - 千万不要对着对象直接修改共有属性,这样会导致再本地添加一个同名属性
	          删除:delete 原型对象.属性名;

删除和修改共有和自有.jpg

3、如何为老IE的数组添加indexOf(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(this[i]==key){
						return i;
					}
				}
				return -1;
			}
		}

如何为老IE的数组添加indexOf.jpg

4、*如何判断x是不是一个数组:千万别用typeof,typeof只能判断原始类型,引用类型显示的都是一个object,这道题也不是固定的

	4种:
	1、判断x是否继承自Array.prototype
		Array.prototype.isPrototypeOf(x);

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

	3Array.isArray(x); - ES5提供,只要是ES5+,老IE都不支持!只有数组有

	4、***输出【对象的字符串】形式,说白了就是转为字符串来判断
		在Object的原型上保存着最原始的toString方式
		原始的toString输出的形式:[object 构造函数名]
		***多态:肤浅理解,一个方法有多种表现形态,子对象觉得父对象提供的成员不好用,在本地定义了同名成员,来覆盖父对象
		固定套路:借用:Object.prototype.toString.apply(x) === "[object Array]";
				true->数组		false->不是数组

判断x是不是数组.jpg

5、实现自定义继承:

	1、实现两个对象之间继承:
		子对象.__proto__=父对象;

	2、实现批量对象继承
		构造函数名.prototype=父对象;
		但是要小心时机,必须在创建对象之前,确定关系	

自定义继承.jpg