实现一个bind
1、改变被绑定函数的this指向
2、柯里化,返回一个函数继续接受参数去调用
Function.prototype.bind1 = function (context) {
var args = Array.prototype.slice.call(arguments, 1);
self = this;
return function () {
var innerArgs = Array.prototype.slice.call(arguments);
var finalArgs = args.concat(innerArgs);
return self.apply(context, finalArgs)
}
}
//测试代码
function test(a, b, c) {
console.log(a, b, c, this.name)
}
var obj = {
name: 'linlin'
}
var f = test.bind1(obj, 2, 3)
f(1) //2 3 1 'linlin'
复制代码
实现一个new
一、进行分析new的过程,主要有以下几点
1、创建一个新的对象
2、把obj的__proto__指向fn的prototype,实现继承
3、改变this的指向,执行构造函数、传递参数,fn.apply(obj,) 或者 fn.call()
4、返回新的对象obj
二、实现代码
function New(f) {
//返回一个func
return function () {
const obj = {}; //创建一个新的对象
obj.__proto__ = f.prototype; //把obj的__proto__指向fn的prototype,实现继承
f.apply(obj, arguments);//改变this的指向
return obj; //返回一个Object
}
}
function test(name) {
this.name = name;
}
test.prototype.getAge = function () {
console.log(this.name)
}
var f = New(test)('linlin');
f.getAge();//linlin
复制代码