面试了许多求职者,很多求职者只知其然,而不知所以然,写此文章为广大前端小伙伴指引迷津。纯干货!纯干货!纯干货!
目录
第一场
new 发生了什么
用new操作符创建对象发生的事情:
- 创建一个新对象;
- 将构造函数的作用域赋给这个对象(因此this就指向了这个对象);
- 执行构造函数中的代码(为这个对象添加属性和方法,以及执行构造函数中其他的代码);
- 把这个新对象返回;
注意:原本的构造函数是window对象的方法,如果不用new操作符而直接调用,那么构造函数的执行对象就 是window,即this指向了window。现在用new操作符后,this就指向了新生成的对象。理解这一步至关重要。
// 创建构造函数
function Person(name,age){
this.name = name;
this.age = age;
}
// 定义自己实现的类似new方法,
function create(fn,...args){
let obj = {};
fn.call(obj,...args);
return obj;
}
// 使用自己定义的方法创建对象,第一参数是构造函数,相当于模板。从第二个参数起,为对象 的属性值。
let obj = create(Person,'张三',18);
console.log(obj) // {name: "张三", age: 18}
闭包实现柯里化
答:闭包 + 递归。闭包:延迟处理
let arr = []
function addCurry() {
let arg = Array.prototype.slice.call(arguments); // 递归获取后续参数
arr = arr.concat(arg);
if (arg.length === 0) { // 如果参数为空,则判断递归结束
return arr.reduce((a,b)=>{return a+b}) // 求和
} else {
return addCurry;
}
}
addCurry(1)(2)(3)()
ts 装饰器
现在就是,假设我们有一个类,然后呢,要对它额外进行一些修饰,这个就是装饰器要干的事情了。
- 装饰器本身就是一个函数;
- 装饰器接收的参数是构造函数;
- 装饰器通过
@符号来进行使用。