使对象不可调用

Ben*_*Ben 2 javascript

在JavaScript中,函数是可调用的.

我可以从函数中删除此属性,只留下一个普通对象吗?

var foo = function () {};
foo.[[callable]] = false; // pseudocode
foo(); // "foo is not a function"
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 6

我可以从函数中删除此属性,只留下一个普通对象吗?

编号功能(评估行为,而不是它们的对象属性)几乎是不可变的.

可召集的对象是由它们是否有确定的[[call]]槽.该规范说明了这些:

内部插槽是作为创建对象的过程的一部分分配的,可能无法动态添加到对象中.

(暗示他们也不能动态删除).此外," 这些内部方法不是ECMAScript语言的一部分 "和" 不是对象属性 ",这意味着它们无法通过语言以任何可想象的方式进行访问,设置,删除或操作.

[[call]]slot是各种对象的一部分,它们总是包含一个内部方法,但除了初始化(一次)之外,它们永远不会发生变异.他们有各种各样的:

如您所见,没有办法改变甚至删除[[call]]对象的插槽,甚至在代理上也是如此.你最好的选择是

  • throw在不合适状态下调用时创建函数
  • 通过函数从函数创建一个新的,不可调用的对象

    var obj = Object.assign(Object.create(Object.getPrototypeOf(fn)), fn);
    
    Run Code Online (Sandbox Code Playgroud)

  • 你回答了问题!与观看该视频的其他 100 人以及三名投反对票的人不同。 (2认同)