V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
Kasumi20
V2EX  ›  JavaScript

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

  •  
  •   Kasumi20 · 2022-09-02 18:08:03 +08:00 · 1733 次点击
    这是一个创建于 815 天前的主题,其中的信息可能已经有所发展或是发生改变。

    所以可以用一个匿名构造函数来创建一个匿名对象: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'
    
    7 条回复    2022-09-07 03:51:29 +08:00
    xiaoming1992
        1
    xiaoming1992  
       2022-09-02 19:26:33 +08:00 via Android
    用 ts ,类型严格一些,应该就可以避免纠结这些东西了。我应该两三年没用过 call bind 了,this 也只在 class 里面使用。
    chnwillliu
        2
    chnwillliu  
       2022-09-02 19:43:52 +08:00 via Android
    没有 class 的年代不都是这样么?你甚至可以在构造函数里 return 。

    然而谁在项目里这样写会被拉出来打的。
    SoloCompany
        3
    SoloCompany  
       2022-09-02 20:17:49 +08:00 via iPhone
    new 操作法是一个语法糖,这不是基本常识吗
    DOLLOR
        4
    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
        5
    qeqv  
       2022-09-02 23:15:50 +08:00
    有什么问题? new 本来就是,新建一个空对象,原型链指向函数原型,然后把构造函数的 this 指过去执行
    liuidetmks
        6
    liuidetmks  
       2022-09-03 12:16:22 +08:00
    直接用 ts 吧,忘记这些细节吧
    YuJianrong
        7
    YuJianrong  
       2022-09-07 03:51:29 +08:00
    如果你是从 es5 过来的就会知道这些细节了。
    现在知道不知道都无所谓,反正很少用了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5635 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 03:20 · PVG 11:20 · LAX 19:20 · JFK 22:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.