在 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]]
用户定义的函数对象,在FunctionAllocate
的第 8 步中初始化 -
[[call]]
内置函数对象,由环境隐式初始化 -
[[call]]
绑定(bind)函数对象,在BoundFunctionCreate
的第 6 步中初始化 -
[[call]]
一些代理对象,在ProxyCreate
的步骤 7a 中有条件地初始化当且仅当代理目标也是可调用的
如您所见,无法更改甚至删除对象的 [[call]]
插槽,即使在代理上也是如此。你最好的选择是
- 在不合时宜的状态下调用函数
throw
通过以下方式从函数中创建一个新的、不可调用的对象
var obj = Object.assign(Object.create(Object.getPrototypeOf(fn)), fn);
关于javascript - 使对象不可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29680473/