持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
目录
今日题
题目
今天的每日一题我们暂时决定先换个形式,起因是昨天晚上我在群里摸鱼时,无意看到一位老哥发了一道面试题,我觉得难度还可以,所以拿出来大家一起做做。
分析
这道题没啥好分析的,能实现效果即可。由于这种类型的题不存在唯一答案,所以我昨晚在CodePen上注册了一个账号,今天使用它的在线编辑功能,与大家一起讨论。您可以点击此处来与我们共同完成此题。 注意点:
- 您完全可以将您的答案留言在评论区与大家一起讨论
- 您可以不必使用CodePen
- 倘若您决定使用在线编辑功能,您必须要确保留下
您的名字、代码、编写的时间。您所编写的代码仅供他人学习,若您的代码足够优秀,也可供他人学习。
昨日题
题目
var name = '蜘蛛侦探'
var age = 5
class Person {
constructor(name = '鲨鱼辣椒') {
this.name = name
}
sayName() {
console.log(this.name)
}
sayAge() {
var age = this ? this.age : 6
console.log(age)
}
}
var p = new Person('蜻蜓队长')
p.age = 7
var bar = p.sayAge
p.sayName()
bar()
答案
'蜻蜓队长',6
解析
老规矩,我们先来分析一下昨天的题《一道题带你掌握class的基本用法》。首先使用var声明了两个变量name和age,这里使用var声明的目的就是让name和age去作为window的属性而存在。然后定义了一个Person类,这个Person会初始化其实例对象的name属性,并且在constructor中给了一个默认值,如果通过new调用该构造函数时没有传递参数则使用默认值'鲨鱼辣椒',如果传递了参数,则使用传递的参数,其次Person的原型对象上有两个方法,sayName和sayAge。接下来是通过new调用Person类,并将Person类返回的实例对象给了p,然后给p添加age属性,再将p.sayAge赋值给bar。最后开始调用函数,先调用sayName,因为sayName中的this为实例对象p,而constructor中已经对实例对象的name属性进行了初始化,所以输出'蜻蜓队长';调用bar,输出6,这里要注意的是,bar确实是通过window调用的(《2022-05-20》),但类中的一般方法默认是开启了严格模式,而在严格模式中如果函数的this指向window,那么this为undefined,所以输出为6
结语
此文章已收录至《JavaScript每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。创作不易,少年,就请留个赞再走吧!