在本次我们不去只有原始方式去写,大家可以先思考一下,大致整理一下思路
一、介绍
我们首先介绍一下call,以方便我们进一步去思考怎么去写
1.可以进行函数的调用
function a() {
console.log(1)
}
a.call()//此时会打印1
2.可以修改函数的this指向
1).如果不传参数,默认this指向window
let obj = {
a: function() {
console.log(this)
}
}
obj.a.call()//此时会打印window这个全局对象
2).如果只传一个参数,this指向该参数(undefined或null默认指向window)
let obj = {
a: function() {
console.log(this)
}
}
let b = [1,2,3]
obj.a.call(undefined)//此时打印的还是window对象
obj.a.call(b)//此时打印的为[1,2,3]
3.如果传多个参数,this指向第一个参数,剩余的参数是参数列表
let obj = {
a: function(b) {
console.log(this + b)
}
}
let c = '作者'
obj.a.call(c, '真帅')//作者真帅
二、globalThis
在这里我们首先引入一个词globalThis这个属性
globalThis这个属性包含全局的this值,可以简单理解为全局对象
当我们在任何作用域中打印globalThis
console.log(globalThis)//全局对象
function a() {
console.log(globalThis) //同样是window这个全局对象
}
a()
三、开始手写
相信大家在这个时候大概知道该怎么写了,所以我们直接上代码
//写在函数的原型上,方便使用
Function.property.cal = function(a,...b) {
a = a === undefined || a === null ? globalThis : Object(a)
//当a等于null或者undefined时 a 等于全局对象
//当a为一个其他数据时 会通过Object这个方法返回这个原本的样式
a.fn = this
const c = a.fn(...b)
}
function d() {
console.log(this)
}
function g(f) {
console.log(this + f)
}
let e = '作者'
d.cal(window)//此时会打印window这个全局对象
g.cal(e,'真帅')//'作者真帅'
通过以上变可以实现cal方法,但大家仔细思考便会发现一个很细微的问题
那便是,如果出现重名问题怎么办,毕竟这种事情时无法避免的,但我们能否去避免这个问题呢
大家看后可以思考一下,提示一下:可以使用基本数据类型的某个数据类型(下期可能会讲解一下)
希望能帮助大家,有问题可以私信或评论哦