今天才知道,非箭头函数和非 native 函数都可以作为构造函数

2022-09-02 18:08:03 +08:00
 Kasumi20

所以可以用一个匿名构造函数来创建一个匿名对象:new function() { ... }

我甚至查不到相关的说法,只看到有一个 stackoverflow 问题: https://stackoverflow.com/questions/40096704/new-function-vs-new-function

然后,会发生什么事情呢,调用了 bind()函数绑定了 this 值的函数也可以用一个新的空对象去调用,本来连 apply 和 call 都无法更改 this 值的:

function test() {
    console.log('调用 test()函数, this 值是:', this);
}
test = test.bind({ a: 1 });
test();
new test();

真的太容易混淆了吧:

typeof Function
'function'
typeof function() {}
'function'
typeof new Function
'function'
typeof new function() {}
'object'
1580 次点击
所在节点    JavaScript
7 条回复
xiaoming1992
2022-09-02 19:26:33 +08:00
用 ts ,类型严格一些,应该就可以避免纠结这些东西了。我应该两三年没用过 call bind 了,this 也只在 class 里面使用。
chnwillliu
2022-09-02 19:43:52 +08:00
没有 class 的年代不都是这样么?你甚至可以在构造函数里 return 。

然而谁在项目里这样写会被拉出来打的。
SoloCompany
2022-09-02 20:17:49 +08:00
new 操作法是一个语法糖,这不是基本常识吗
DOLLOR
2022-09-02 21:15:16 +08:00
我的开发工作已经避开使用 function 关键字。只用箭头函数和对象方法,可避免误用 new 的情况。

const obj = {
test(){
console.log(this)
}
}

const test = () => {}

const objTest = obj.test

// Uncaught TypeError: obj.test is not a constructor
new obj.test()
// Uncaught TypeError: test is not a constructor
new test()
// Uncaught TypeError: objTest is not a constructor
new objTest()
qeqv
2022-09-02 23:15:50 +08:00
有什么问题? new 本来就是,新建一个空对象,原型链指向函数原型,然后把构造函数的 this 指过去执行
liuidetmks
2022-09-03 12:16:22 +08:00
直接用 ts 吧,忘记这些细节吧
YuJianrong
2022-09-07 03:51:29 +08:00
如果你是从 es5 过来的就会知道这些细节了。
现在知道不知道都无所谓,反正很少用了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/877315

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX