1.用一个柯里化函数实现累加
// 柯里化函数
function currying(fn,length) {
var length = length || fn.length;
return function(...arg) {
if(arg.length >= length) {
return fn(...arg);
} else {
return currying(fn.bind(null,...arg),length-arg.length);
}
}
}
function $add(a1,a2,a3,a4) {
return a1 + a2 + a3 + a4;
}
var add = currying($add,4);
console.log(add(1,2,3,4));
console.log(add(1,2)(3,4));
console.log(add(1)(2)(3,4));
console.log(add(1)(2)(3)(4));
2.实现一个bind函数
//myBind函数
Function.prototype.myBind = function (argThis,...arg) {
const _Fn = this;
return function() {
const args = [...arg,...arguments];
return _Fn.apply(argThis,args);
}
}
var name = 'Nick'
function sayName() {
return this.name
}
var obj = {
name: 'Lily'
}
console.log(sayName())
var sayNamenew = sayName.myBind(obj);
console.log(sayNamenew())
3.实现一个new函数
//myNew函数
function Dog(name) {
this.name = name;
this.bar = function() {
console.log(`my name is ${this.name}`)
}
// return this
}
function myNew(fn,...arg) {
// let _Fn = new Object();
// _Fn.__proto__ = fn.prototype;
let _Fn = Object.create(fn.prototype);
let result = fn.apply(_Fn,arg);
return typeof result === 'object' ? result : _Fn;
}
var teddy = myNew(Dog,'Teddy');
console.log(teddy.name)
teddy.bar();
网友评论