1. js实现const
function myConst (key, value) {
const desc = {
value: value,
writable: false
}
Object.defineProperty(window, key, desc);
}
myConst('obj', {a: 1})
2. js实现new
function myNew (fn, params) { // 构造函数,构造函数参数
const args = Array.prototype.slice.call(arguments);
const fn = args.shift();
const obj = Object.create(fn.prototype); // this对象
const res = fn.apply(obj, args); // 如果return的是一个对象,new命令直接返回该对象,否则返回this对象
return (typeof res === 'object' && typeof res !=='null') ? res : obj;
}
var p = myNew(Person, '张三', 28)
3. js实现instanceof
// 模拟 left instanceof right,
function isInstanceof(left, right){
// object和null排除,因为后面追溯原型要用到
const baseType = ['number', 'string', 'boolean', 'undefined', 'symbol'];
if(baseType.includes(typeof(left))) return false;
// 将right.prototype依次和left原型链上的每个对象做比较
left = left.__proto__;
while(true){
if(left === null) return false;
if(left === right.prototype) return true;
left = left.__proto__;
}
}
4. 实现柯里化
将一个多参函数转换成一系列的单参函数,而部分应用则是将一个多参函数切一刀,柯里化是切好多刀,直到中间每个函数都是单参的,最后得到柯里化函数。
(1)与普通函数的对比示例:
const add = function(x, y, z) {
return x + y + z;
}
const curAdd = currying(add); //传入多参函数
const res = curAdd(1)(2)(3); // 调用柯里化函数
console.log(res); // 6
(2)js实现
function toCurry(fn, ...args) {
return function () {
// 合并上一次缓存的参数和本次传入的参数
args = [...args, ...arguments];
// 判断参数数量是否等于原函数的参数个数
// fn.length表示函数定义时的参数个数
if (args.length < fn.length) {
// 不够的话,继续递归
return toCurry(fn, ...args);
} else {
// 数量足够,执行函数并返回结果
return fn.apply(null, args);
}
}
}