# 原生JS手写函数

# 深拷贝(deepclone)

简单版:

const newObj = JSON.parse(JSON.stringify(oldObj));
1

局限性:

  1. 他无法实现对函数 、RegExp等特殊对象的克隆。
  2. 会抛弃对象的constructor,所有的构造函数会指向Object。
  3. 对象有循环引用,会报错。
function isObj(obj) {
	return (typeof obj === 'object' || typeof obj === 'function') && obj !== null;
}

function deepCopy(obj) {
	let tempObj = Array.isArray(obj) ? [] : {}
	for (let key in obj) {
		tempObj[key] = isObj(obj[key]) ? deepCopy(obj[key]) : obj[key]
	}
	return tempObj;
}
1
2
3
4
5
6
7
8
9
10
11

# 实现一个call

call做了什么:

  • 将函数设为对象的属性
  • 执行&删除这个函数
  • 指定this到函数并传入给定参数执行函数
  • 如果不传入参数,默认指向为 window
// 模拟 call bar.mycall(null);
//实现一个call方法:
Function.prototype.myCall = function (context) {
	//此处没有考虑context非object情况
	context.fn = this;
	let args = [];
	const len = arguments.length;
	for (let i = 1; i < len; i++) {
		args.push(arguments[i]);
	}
	context.fn(...args);
	let result = context.fn(...args);
	delete context.fn;
	return result;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
最近更新: 9/22/2022, 5:59:36 AM