当前位置:网站首页>Manually implement call, apply and bind functions
Manually implement call, apply and bind functions
2022-04-23 17:14:00 【MiMenge】
Realization call
Function.prototype.myCall = function (targetObj, ...resule) {
// Judge whether the incoming object exists
targetObj = targetObj || window;
// Hang on to the incoming object this Point to , here this To call myCall function
targetObj.fn = this;
// Call... Internally using an incoming object fn Method , This enables changes this Point to , Point to the target object that is passed in
let value = eval('targetObj.fn(...resule)');
// Delete target object fn Method
delete targetObj.fn
// Returns the result of the call
return value;
}
let obj = {
uname: 'Tom'
}
function demo(a, b){
console.log(this.uname, a, b);
}
demo();// undefined undefined undefined
demo.myCall(obj, 1, 2);
// Tom 1 2
Realization apply ( Subject and call almost , Different ways of passing in parameters )
Function.prototype.myApply = function (targetObj, resule) {
targetObj = targetObj || window;
targetObj.fn = this;
let value = eval('targetObj.fn(...resule)');
delete targetObj.fn
return value;
}
let obj = {
uname: 'Tom'
}
function demo(x, y){
console.log(this.uname, x, y);
}
demo();// undefined undefined undefined
demo.myApply(obj, [1, 2]);
// Tom 1 2
Realization bind
Function.prototype.myBind = function (targetObj, ...resule) {
// Determine whether the called object is a function
if (typeof this !== "function") {
throw new Error("this must be a function");
}
// Create variables to save this Point to
// here this Point to the function called externally
let self = this;
// The function to be created returns
let backFunc = function () {
// First determine the of the calling object this Whether it is the same as this function this
// Yes, change this Point to yourself ,( In fact, the last thing to return is this A function that points to itself )
// If not, change the caller this Point to the incoming object , Pass the parameter to the calling this in .
self.apply(this instanceof self ?
this : targetObj, resule.concat(Array.prototype.slice.call(arguments)));
}
// Judge whether the call has a prototype
if(this.prototype) {
// If so, assign the prototype to the returned function
backFunc.prototype = Object.create(this.prototype);
}
// Return function
return backFunc;
}
let obj = {
uname: 'Tom'
}
function demo(x, y){
console.log(this.uname, x, y);
}
demo();// undefined undefined undefined
demo.myBind(obj, 1, 2)();
// Tom 1 2
版权声明
本文为[MiMenge]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204230553027792.html
边栏推荐
猜你喜欢
. net type transfer
Detailed explanation of the penetration of network security in the shooting range
RPC核心概念理解
ClickHouse-表引擎
C语言函数详解
Nodejs installation and environment configuration
EF core in ASP Generate core priority database based on net entity model
Webapi + form form upload file
2.Electron之HelloWorld
ASP. Net core dependency injection service life cycle
随机推荐
Clickhouse - data type
VLAN advanced technology, VLAN aggregation, super VLAN, sub VLAN
groutine
[logical fallacy in life] Scarecrow fallacy and inability to refute are not proof
Promise (IV)
01-初识sketch-sketch优势
Clickhouse SQL operation
Promise (I)
快时钟同步慢时钟域下的异步控制信号slow clk to fast clk
matlab如何绘制已知公式的曲线图,Excel怎么绘制函数曲线图像?
Detailed explanation of Milvus 2.0 quality assurance system
Interface document yaml
Redis docker installation
ASP. Net core dependency injection service life cycle
Using quartz under. Net core -- operation transfer parameters of [3] operation and trigger
Clickhouse table engine
MySQL master-slave configuration under CentOS
Feign report 400 processing
Aiot industrial technology panoramic structure - Digital Architecture Design (8)
Customize my_ Strcpy and library strcpy [analog implementation of string related functions]