写点什么

JavaScript 进阶(二)上

用户头像
Augus
关注
发布于: 53 分钟前

写在前面,兜兜转转,来来回回,从开始学习 JS 到现在已经工作这些来年,我和 JS 每天的生活可以用如胶似漆来形容。但自认为对他认识的还不够深刻。故从头再来,从基础开始。Go!!!

new

  • 新⽣成了⼀个对象

  • 链接到原型

  • 绑定 this

  • 返回新对象

在调⽤ new 的过程中会发⽣以上四件事情,我们也可以试着来⾃⼰实现⼀个 new


function create() {
// 创建⼀个空的对象
let obj = new Object()
// 获得构造函数
let Con = [].shift.call(arguments)
// 链接到原型
obj.__proto__ = Con.prototype
// 绑定 this,执⾏构造函数
let result = Con.apply(obj, arguments)
// 确保 new 出来的是个对象
return typeof result === 'object' ? result : obj
}
复制代码


this


function foo() {
console.log(this.a)
}
var a = 1
foo()
var obj = {
a: 2,
foo: foo
}
obj.foo()

// 以上两者情况 `this` 只依赖于调⽤函数前的对象,优先级是第⼆个情况⼤于第⼀个情况
// 以下情况是优先级最⾼的,`this` 只会绑定在 `c` 上,不会被任何⽅式修改 `this` 指向
var c = new foo()
c.a = 3
console.log(c.a)
// 还有种就是利⽤ call,apply,bind 改变 this,这个优先级仅次于 new
复制代码


看看箭头函数中的 this


function a() {
return () => {
return () => {
console.log(this)
}
}
}
console.log(a()()())
复制代码


箭头函数其实是没有 this 的,这个函数中的 this 只取决于他外⾯的第⼀个不是箭头函数的函数的 this 。在这个例⼦中,因为调⽤a 符合前⾯代码中的第⼀个情况,所以 this 是 window 。并且 this ⼀旦绑定了上下⽂,就不会被任何代码改变

用户头像

Augus

关注

爱瞎搞的软件开发工程师 2021.06.10 加入

某摸鱼集团

评论

发布
暂无评论
JavaScript进阶(二)上