在JavaScript中,函数是可调用的.
我可以从函数中删除此属性,只留下一个普通对象吗?
var foo = function () {};
foo.[[callable]] = false; // pseudocode
foo(); // "foo is not a function"
Run Code Online (Sandbox Code Playgroud)
我可以从函数中删除此属性,只留下一个普通对象吗?
编号功能(评估行为,而不是它们的对象属性)几乎是不可变的.
的可召集的对象是由它们是否有确定的[[call]]
槽.该规范说明了这些:
内部插槽是作为创建对象的过程的一部分分配的,可能无法动态添加到对象中.
(暗示他们也不能动态删除).此外," 这些内部方法不是ECMAScript语言的一部分 "和" 不是对象属性 ",这意味着它们无法通过语言以任何可想象的方式进行访问,设置,删除或操作.
[[call]]
slot是各种对象的一部分,它们总是包含一个内部方法,但除了初始化(一次)之外,它们永远不会发生变异.他们有各种各样的:
[[call]]
用户定义的函数对象,在步骤8中初始化 FunctionAllocate
[[call]]
内置函数对象,由环境隐式初始化[[call]]
绑定的函数对象,在步骤6中初始化 BoundFunctionCreate
[[call]]
一些代理对象,ProxyCreate
如果代理目标也是可调用的,则在步骤7a中有条件地初始化如您所见,没有办法改变甚至删除[[call]]
对象的插槽,甚至在代理上也是如此.你最好的选择是
throw
在不合适状态下调用时创建函数通过函数从函数创建一个新的,不可调用的对象
var obj = Object.assign(Object.create(Object.getPrototypeOf(fn)), fn);
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
588 次 |
最近记录: |