继承的面试/笔试题
判断自有/共有:
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自动释放,局部变量随之释放了
闭包的使用
概念: 保护一个可以【反复使用的局部变量】的一种词法结构,也是一个函数 使用场景: 希望保护一个可以【反复使用的局部变量】- 私有化变量
创建闭包
- 两个函数进行嵌套
- 外层函数创建出受保护的变量
- 外层函数return出内层函数
- 内层函数在操作受保护的变量
特点:
- 外层函数调用了几次,就创建了几个闭包,受保护的变量就有了几个副本
- 同一次外层函数调用,返回的内层函数,都是在操作同一个受保护的变量
缺点: 受保护的变量,永远都不会被释放,使用过多,会导致内存泄漏 - 闪退,不可多用!
防抖节流
四个可能需要防抖节流的事件
- 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,可以一层一层的找到每个人的原型,形成了一条链式结构 作用: 找共有属性和共有方法的,会逐级向上查找,如果最顶层也没有才会报错
闭包
保护一个可以【反复使用的局部变量】的一种词法结构,也是一个函数 作用: 专门用于防抖节流