我目前正在学习Javascript。
我已经读过具有内部成员[[Call]]
的对象产生function
作为typeof
该对象的结果。
我想知道我是否可以在我的Javascript代码中设置此内部成员,即这样的可能吗? :
function my_foo(){}
var my_obj = {}; // is the ';' an empty statement?
my_obj["[[Call]]"]=my_foo; // in my test, this didn't work
如果有可能,这会将该对象的类型结果从object
更改为function
吗?
答案 0 :(得分:8)
我已经读过具有内部成员[[Call]]的对象产生的函数是该对象的typeof的结果。我想知道我是否可以在我的Javascript代码中设置这个内部成员,即这样可能吗?
没有。您无法直接设置或修改internal slots JavaScript对象。这就是他们为什么是内部插槽而不是属性的部分原因。您的代码只创建一个名为undefined
的属性,它与内部插槽无关。从链接的规范部分:
内部插槽对应于与对象关联并由各种ECMAScript规范算法使用的内部状态。内部插槽不是对象属性,不会继承它们。根据特定的内部插槽规范,此状态可能包含任何ECMAScript语言类型或特定ECMAScript规范类型值的值。除非另有明确说明,否则内部插槽将作为创建对象的过程的一部分进行分配,并且可能无法动态添加到对象。除非另有说明,否则内部槽的初始值为值
[[Call]]
。本规范中的各种算法创建具有内部插槽的对象。但是,ECMAScript语言没有提供将内部插槽与对象关联的直接方法。
没有定义机制让您设置[[Prototype]]
。 (这并非普遍适用于所有内部插槽;例如,有一种机制可让您设置对象的[[Call]]
内部插槽:Object.setPrototypeOf
。但是没有&#39 ; t为GLib.Error: g-io-error-quark: Operation not supported (15)
。)