如何创建无[[Construct]]内部方法但可绑定的函数对象?此方法是否唯一?
不是唯一方案,还有这些可行方式
你给出的示例其实存在误解——普通对象方法绑定后生成的函数仍然具备[[Construct]]内部方法,实际测试中new bar()并不会抛出TypeError,而是会创建一个新实例(此时this指向该实例,name为undefined)。
要真正创建一个无法被new调用(即无[[Construct]])但支持绑定操作的函数,有多种可行方案:
方案1:箭头函数
箭头函数本身就没有[[Construct]]内部方法,无法被new调用,同时支持用bind绑定参数(注意:箭头函数的this由词法作用域决定,bind无法修改其this指向,但可以绑定前置参数):
const foo = (msg) => { console.log(msg) }; // 绑定参数'bar' const bar = foo.bind(null, 'bar'); bar(); // 输出 'bar' new bar(); // 抛出 TypeError: bar is not a constructor
方案2:用Proxy拦截构造操作
通过Proxy包装普通函数,拦截construct陷阱,阻止new调用:
function foo() { console.log(this.name) } // 包装函数,禁止构造调用 const noConstructFoo = new Proxy(foo, { construct() { throw new TypeError('此函数不能作为构造函数使用'); } }); // 绑定this和参数 const bar = noConstructFoo.bind({ name: 'bar' }); bar(); // 输出 'bar' new bar(); // 抛出 TypeError: 此函数不能作为构造函数使用
方案3:绑定箭头函数生成新函数
箭头函数本身无[[Construct]],用bind绑定后生成的新函数同样无法被new调用:
const foo = () => { console.log(this?.name) }; const bar = foo.bind({ name: 'bar' }); bar(); // 输出当前词法作用域中this的name(箭头函数this无法被bind修改) new bar(); // 抛出 TypeError: bar is not a constructor
内容的提问来源于stack exchange,提问作者Ben Aston
相关产品推荐
相关产品推荐

