js 实现简易版call,apply,bind,new

实现 call

Function.prototype.calls = function(cont){
    cont = cont || window //不传cont默认为window
	cont.demo = this
	let args = [...arguments].slice(1) //获取传参
    let ret = cont.demo(...args) //进行了隐式绑定,具体可看我讲隐式绑定的文章了解
    delete cont.demo //销毁临时变量
	return ret
}
var name = "windows"
var obj = {
	name: "obj",
	fn: function(names){
		console.log(this.name,names)
	}
}
obj.fn("fn") //obj fn
obj.fn.call(this,"call") //windows call
obj.fn.calls(this,"calls") //windows calls

实现 apply

apply与call的区别就只有传参不同,apply是传入数组,call是多个变量的传入

Function.prototype.applys = function(cont,arr){
    cont = cont || window //不传cont默认为window
	cont.demo = this
    let ret = cont.demo(...arr)
    delete cont.demo //销毁临时变量
	return ret
}
var name = "windows"
var obj = {
	name: "obj",
	fn: function(names){
		console.log(this.name,names)
	}
}
obj.fn("fn") //obj fn
obj.fn.apply(this,["apply"]) //windows call
obj.fn.applys(this,["applys"]) //windows calls

实现 bind

bind与前面两个不同之处就是,bind返回的是一个函数

Function.prototype.binds = function(cont){
	let that = this
	let args = [...arguments].slice(1)
	return function fn(){
		//concat是为了合并参数
		return that.apply(cont,args.concat(...arguments))
    }
}
var name = "windows"
var obj = {
	name: "obj",
	fn: function(names){
		console.log(this.name,names)
	}
}

//测试
obj.fn("fn") //obj fn
obj.fn.bind(this,"bind")() //windows bind
obj.fn.binds(this,"binds")() //windows binds

实现 new

new关键词主要做了4个操作

  1. 生成一个新对象
  2. 新对象链接到原型
  3. 新绑定函数调用的this
  4. 如果函数没有返回其他对象,则返回这个新对象
function news(cont){
	let obj = {}
	obj.__proto__ = cont.prototype
	let demo = cont.apply(obj,[...[...arguments].slice(1)])
	return typeof demo == "object"?demo:obj
}

//测试
function classs(value){
	this.value = value
}
classs.prototype.test = function(){
	console.log(this.value)
}
var aaa = new classs("aaaaaaa")
var bbb = news(classs,"bbbbbb")
console.log(aaa)
console.log(bbb)

实现 Object.create()

function objectCreate(o){
	function fn(){};
	fn.prototype = o;
	return new fn();
}

//测试
var demo = {
	a:1
}
var demos1 = Object.create(demo);
var demos2 = objectCreate(demo);
console.log(demos1)
console.log(demos2)

如有有疑问的地方,欢迎留言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值