使用new Function() 创建的对象中的name属性为什么不能输出?

1.使用new Function() 可以定义一个函数,同时也是一个对象。既然是对象就一定可以设置属性和值。可是我发现新建的对象中name属性的值不返回任何数据,这是为什么呢?
代码如下:


var obj = new Function();
console.log(obj instanceof Object);//返回true ,确定是一个对象
obj.name= "zhangwuji";
obj.age = "18";
console.log(obj.age);// 返回18 ,确定添加属性成功
console.log(obj.abc);// 返回undefined 没有定义这个属性
console.log(obj.name);// 没有任何输出?
console.log(Object.keys(obj));// 查看obj 的属性,只有age ,但是与上一行相隔一个空白行

求解!谢谢~

阅读 2.6k
3 个回答

雷猴,
new Funticon(),出来的属于匿名函数
当你console.log(obj.name)时,其实并不是没有输出,而是打印了anonymous(匿名)
在function类型的对象中name属于不可被复写的属性,可以直接输出=>函数本身名称
如:
function doSomething() {}
doSomething.name; // "doSomething"
详情可以查看
https://developer.mozilla.org...
所以当你对name进行赋值时,是失败的。

Function 构造函数 创建一个新的Function对象,new Function()是个匿名函数,obj.name应该是个anonymous吧,这是只读的,改不了,使用new Function(...)语法创建的函数或只是 Function(...) create Function对象及其名称为“anonymous”,链接描述

alert((new Function("x","y","return x*y;")(2,3)));// "6" 

根据ecma-262的文档:

  • new Function 在引擎内部创建对象时调用 SetFunctionName(F, "anonymous")
  • 而正常的函数声明如 function somefun(){} 在引擎内部调用 SetFunctionName(value, bindingId), bindingId 就是somefun

http://www.ecma-international...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题