1. The call() method caller (MemberExpression) is a function body (the value of this) so you can assign the function body to a property of the target object so that the object has the method 2. Call this method into optional parameters 3. Delete the custom method assigned to the object Function. The prototype. MyCall = Function (targetObj paramter) {targetObj. Fn = this; // 1. The body of the function to be called is assigned to the property targetobj.fn (... Paramter) // 2. The target object calls the method delete targetobj.fn; } // If the object already has the fn attribute, the code above will overwrite the original value. So how can we solve it? Function.prototype.my_Call = Function (context, paramter) { if (typeof context === "object") { context = context || window; } else { Object.create(null) } let fn = Symbol() context[fn] = this; const result = context[fn](paramter); delete context.fn; return result; } const obj = { name: "Wade ", sayHello(params) {console.log(' ${this.name} : hello, please take ${params} ')}} const obj1 = {name: 'Andy'} obj.sayhello. my_Call(obj1, 'sugar ');Copy the code