2023-5-26(第十八天)

47 阅读1分钟

继承的面试/笔试题

判断自有/共有:

1、判断自有:
obj.hasOwnProperty("属性名");
2、判断共有:
if(obj.hasOwnProperty("属性名")==false&&"属性名" in obj){
    共有
}else{
    没有
}
​
//in关键字,会自动查找整条原型链上的属性,找到了结果为true,找不到结果为false
完整公式:
if(obj.hasOwnProperty("属性名")){
    自有
}else{
    if("属性名" in obj){
        共有
    }else{
        没有
    }
}

修改和删除自有/共有

自有:

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

共有:

修改:原型.属性名=新属性值; ​ 删除:delete 原型.属性名;

注: 虽然能用原型的属性和方法,但是无法直接修改和删除原型的属性和方法

为老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(this[i]==key){
                return i;
            }
        }
        return -1;
    }
}
var arr1=[1,2,3,4,5];
var arr2=[2,4,6,8,10];
arr1.indexOf(2);
arr2.indexOf(2);

判断是不是数组

注: 不能用typeof,只能检查原始类型, 不能检查引用类型,如果检查引用类型的得到的结果都是一个object

1、判断x是不是继承自Array.prototype
Array.prototype.isPrototypeOf(x);
​
//结果为true,说明是数组,结果为false,说明不是数组
2、判断x是不是由Array这个构造函数创建
x instanceof Array;
3、Array.isArray(x)

ES5新增的方法,只有数组有

4、*输出【对象的字符串】形式

对象的toString方法输出的形式:[object 构造函数名]

多态: 子对象觉得父对象的成员不好用,就在本地定义了一个同名函数,覆盖了父对象的成员。

不严格定义说法: 同一个函数,不同的人使用,表现出来得效果不一样,由多种形态 固定用法:

Object.prototype.toString.call/apply(x) === "[object Array]";

自定义继承:

两个对象之间设置继承:
子对象.__proto__=父对象
多个对象之间设置继承:

构造函数名.prototype=父对象; 注: 应该在创建对象之前就设置好继承关系

闭包

函数的执行原理

1、程序加载时
  • 创建执行环境栈(ECS):保存函数调用顺序的数组
  • 首先压入全局执行环境(全局EC)
  • 全局EC引用着全局对象window
  • window种保存着全局变量
2、定义函数时
  • 创建函数对象:封装代码段
  • 在函数对象中有一个scope(作用域)属性:记录着函数来自的作用域是哪里
  • 全局函数的scope都是window
3、调用前
  • 在执行环境栈(ECS)压入新的EC(函数的EC)
  • 创建出活动对象(AO):保存着局部变量
  • 在函数的EC中有一个scope chain(作用域链)属性引用着AO
  • AO有一个parent属性是函数的scope引用着的对象
4、调用时:
  • 以上三步带来了变量的使用规则:优先使用局部的,局部没有找全局,全局没有就报错
5、调用完:
  • 函数的EC会出栈,没人引用AO,AO自动释放,局部变量随之释放了

闭包的使用

概念: 保护一个可以【反复使用的局部变量】的一种词法结构,也是一个函数 使用场景: 希望保护一个可以【反复使用的局部变量】- 私有化变量

创建闭包
  1. 两个函数进行嵌套
  2. 外层函数创建出受保护的变量
  3. 外层函数return出内层函数
  4. 内层函数在操作受保护的变量

特点:

  • 外层函数调用了几次,就创建了几个闭包,受保护的变量就有了几个副本
  • 同一次外层函数调用,返回的内层函数,都是在操作同一个受保护的变量

缺点: 受保护的变量,永远都不会被释放,使用过多,会导致内存泄漏 - 闪退,不可多用!

防抖节流

四个可能需要防抖节流的事件

  • elem.onmousemove
  • input.oninput
  • window.onresize
  • window.onscroll

触发的很快,但是要减少修改DOM树次数

防抖节流公式
function fdjl(){
	var timer=null;
	return function(){
		if(timer){clearTimeout(timer);timer=null;}
		timer=setTimeout(()=>{
			操作;
		},间隔毫秒数)
	}
}
var inner=fdjl()

两链一包:

作用域链

以函数的EC的scope chain属性为起点,经过AO逐级引用,形成的一条链式结构 作用: 查找变量,来带了变量的使用规则:优先使用局部的,局部没有找全局,全局没有就报错

原型链

每个对象都有一个属性.proto,可以一层一层的找到每个人的原型,形成了一条链式结构 作用: 找共有属性和共有方法的,会逐级向上查找,如果最顶层也没有才会报错

闭包

保护一个可以【反复使用的局部变量】的一种词法结构,也是一个函数 作用: 专门用于防抖节流