javascript - 使对象不可调用

标签 javascript

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

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

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

最佳答案

Can I remove this attribute from a function, leaving only a normal object?

没有。函数(评估行为,而不是它们的对象属性)几乎是不可变的。

callability对象的数量取决于它们是否具有 [[call]] 插槽。 spec says about those :

Internal slots are allocated as part of the process of creating an object and may not be dynamically added to an object.

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

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

如您所见,无法更改甚至删除对象的 [[call]] 插槽,即使在代理上也是如此。你最好的选择是

  • 在不合时宜的状态下调用函数throw
  • 通过以下方式从函数中创建一个新的、不可调用的对象

    var obj = Object.assign(Object.create(Object.getPrototypeOf(fn)), fn);
    

关于javascript - 使对象不可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29680473/

相关文章:

javascript - react : Implementing a hook to fetch data and return loading state

javascript - React HOC 在 Lifecycle 方法中使用 Context API

javascript - ExtJS 使用组合框编辑 html 值

javascript - 如何有效地对所有 Javascript bool 值进行字符串化?

javascript - Pale Moon 中的简单 firefox 扩展 "not compatible"错误

Javascript float 可用范围

javascript - 捕获具有相同类别的输入的键码

javascript - 将页脚位置更改为页面底部,直到它到达内容

javascript - 使用 Youtube 的 iframe API 嵌入视频获取 "402 Payment Required"

javascript - 如何在webgl中获得像素化效果?