1. new的实现
function New(fn, ...args) {
let obj = {}
obj.__proto__ = fn.prototype
fn.prototype.constructor = fn
let back = fn.call(obj, ...args)
return back instanceof Object ? back : obj
}
function Person(name, age) {
this.name = name
this.age = age
}
let p1 = New(Person, "小红", 18)
console.log(p1);
2. call的实现
Function.prototype.call = function (target, ...args) {
target = target || window
target.fn = this
let result = target.fn(...args)
delete target.fn
return result
}
function fn(a, b, c) {
console.log(this, a, b, c);
}
let obj = {
name: "小红"
}
fn.call(obj, 123, 123, 123)
3. apply的实现
Function.prototype.apply = function (target, args) {
target = target || window
target.fn = this
let result = target.fn(...args)
delete target.fn
return result
}
function fn(a, b, c) {
console.log(this, a, b, c);
}
let obj = {
name: "小红"
}
fn.apply(obj, [123, 123, 123])
4. bind的实现
Function.prototype.bind = function (target, ...args) {
let self = this
return function () {
return self.apply(target, [...args, ...arguments])
}
}
let obj = {
name: "小红"
}
function fn(a, b, c) {
console.log(this);
return a + b + c
}
let text = fn.bind(obj, 12)
console.log(text(2, 3));