interview-answe icon indicating copy to clipboard operation
interview-answe copied to clipboard

168.[JavaScript]手写call,apply,bind

Open webVueBlog opened this issue 5 years ago • 1 comments

[js]

webVueBlog avatar Apr 08 '20 11:04 webVueBlog

/**
 * call
 */
Function.prototype.myCall = function (context = window,...args) {
	if(this === Function.prototype) {
		return undefined
	}
	context = context || window
	const fn = Symbol();
	context[fn] = this;
	const result = context[fn](...args);
	delete context[fn]
	return result 
}
/**
 * apply
 */

Function.prototype.myApply = function (context = window,args) {
	if(this === Function.prototype) {
		return undefined
	}
	const fn = Symbol();
	context[fn] = this;
	let result;
	if(Array.isArray(args)) {
		result = context[fn](..args);
	}else {
		result = context[fn]()''
	}
	delete context[fn]
	return result
}
/**
 * bind
 */

Function.prototype.myBind = function (context, ...args1) {
	if(this === Function.prototype) {
		throw new TypeError('Error')
	}
	const _this = this;
	return function F(...args2) {
		if(this instanceof F) {
			return new _this(...args1,...args2)
		}
		return _this.apply(context,args1.concat(args2))
	}
}

webVueBlog avatar Apr 08 '20 11:04 webVueBlog