在 JavaScript 中,函数是可调用的。
我可以从函数中删除此属性,只留下普通对象吗?
var foo = function () {};
foo.[[callable]] = false; // pseudocode
foo(); // "foo is not a function"
我可以从函数中删除此属性,只留下普通对象吗?
不。函数(求值行为,而不是它们的对象属性)几乎是不可变的。
The 可调用性 http://www.ecma-international.org/ecma-262/6.0#sec-iscallable对象的数量取决于它们是否具有[[call]]
投币口。这规格说明了这些 http://www.ecma-international.org/ecma-262/6.0#sec-object-internal-methods-and-internal-slots:
内部槽是作为创建对象过程的一部分进行分配的,并且不能动态添加到对象中。
(这意味着它们也不能动态删除)。此外, ”这些内部方法不是 ECMAScript 语言的一部分" and "没有对象属性”,这意味着它们不能通过语言以任何可以想象的方式访问、设置、删除或操作。
[[call]]
槽是各种对象的一部分,它们始终包含内部方法,但除了初始化(一次)外,它们永远不会发生变化。它们有多种类型:
-
[[call]] http://www.ecma-international.org/ecma-262/6.0#sec-ecmascript-function-objects-call-thisargument-argumentslist用户定义的函数对象,在步骤 8 中初始化FunctionAllocate http://www.ecma-international.org/ecma-262/6.0#sec-functionallocate
-
[[call]] http://www.ecma-international.org/ecma-262/6.0#sec-built-in-function-objects-call-thisargument-argumentslist内置函数对象,由环境隐式初始化
-
[[call]] http://www.ecma-international.org/ecma-262/6.0#sec-bound-function-exotic-objects-call-thisargument-argumentslist绑定函数对象,在第 6 步中初始化BoundFunctionCreate http://www.ecma-international.org/ecma-262/6.0#sec-boundfunctioncreate
-
[[call]] http://www.ecma-international.org/ecma-262/6.0#sec-proxy-object-internal-methods-and-internal-slots-call-thisargument-argumentslist一些代理对象,在步骤 7a 中有条件地初始化ProxyCreate http://www.ecma-international.org/ecma-262/6.0#sec-proxycreate当且仅当代理目标也是可调用的
正如您所看到的,没有办法改变甚至删除[[call]]
对象的插槽,甚至在代理上也不例外。你最好的选择是
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)