let obj = {
foo: function() {},
bar() {} // 为什么这种方式就不能使用 new 呢
}
new obj.foo(); // 正常
new obj.bar(); // 报错 obj.bar is not a constructor
// 打印 obj,foo 和 bar 没有差异
console.log(obj) // { foo: [Function: foo], bar: [Function: bar] }
// 打印 obj.foo 和 obj.bar 的 constructor, 也没有差异
console.log(obj.foo.constructor); // [Function: Function]
console.log(obj.bar.constructor); // [Function: Function]
想问下在 obj 里面,为什么使用 bar(){} 这种方式就不能使用 new 操作呢?
已解决
悬赏分:70
- 解决时间 2022-01-17 04:37
点赞 0反对 0举报 0
收藏 0
分享 4
回答1
最佳
-
一个对象能不能 new 要看它有没有 [[Construct]] 槽。
在创建函数的时候 [[Construct]] 槽的建立时有条件的:FunctionAllocate 只有 "normal" 函数才可以。
在 FunctionCreate 调用 FunctionAllocate,做过一次类型映射,但 Normal 还是 normal
在 DefineMethod里调用 FunctionCreate ,只有 functionPrototype 存在才是 Normal
Object 内的函数定义(你的第二种形式),调用 DefineMethod 没有提供 functionPrototype PropertyDefinitionEvaluation
于是,它不能构造 ....
你的第一种形式走的是另一条路,并没有通过 DefineMethod ....
支持 0 反对 0 举报2022-01-16 15:56