在创建新对象时,为什么构造函数不返回具有新创建对象名称的对象
在下面,输出为cons{x: "hi"}
对象,为什么不是myobj {x: "hi"}
?
function cons() {
this.x = "hi";
return null;
}
var myobj = new cons();
console.log(myobj);

This article,说"它返回新创建的对象,除非构造函数返回非空对象引用。" 所以它应该返回{ {1}}因为上面的构造函数正在返回myobj{x: "hi"}
。
答案 0 :(得分:2)
在下面,输出为
cons{x: "hi"}
对象,为什么不是myobj {x: "hi"}
?
您看到的内容会因您使用的控制台实施情况而有所不同,但有些(例如Chrome)确实会向您显示。
cons
告诉你对象的类型, 1 而不是对象引用存储的变量。这只是你的意思在查看开发工具时,可以很容易地区分代码中不同类型的对象。
至于原因:请记住,console.log
不知道它的价值来自哪里;它不知道值来自名为myobj
的变量。当您执行console.log(myobj)
时,会读取myobj
的值,然后将值传递到console.log
。因此即使它的设计者想要它也无法打印变量名称。
如果您还想查看变量名称,请将其放入console.log
调用:
console.log("myobj", myobj);
示例:
function cons() {
this.x = "hi";
return null;
}
var myobj = new cons();
console.log("myobj", myobj);
这篇文章说“它返回新创建的对象,除非构造函数返回非
null
对象引用。”所以它应该返回myobj{x: "hi"}
,因为上面的构造函数返回null。
你可以理解的是混淆了两个无关的东西。使用new
调用构造函数的结果,以及将对象引用传递给console.log
的输出。
在您的代码中,var myobj = new cons();
确实会导致new
创建的新对象存储在myobj
中(return null;
对其没有影响)。这句话试图说的是这样的事情不会:
function cons() {
this.x = "hi";
return {hey: "I'm a completely different object"};
}
var myobj = new cons();
console.log(myobj);
在该代码中,cons
通过将非new
对象引用返回到{{1}以外的其他内容,重写 null
的默认行为}。因此this
的结果是对其他对象的引用,而不是对new cons
创建的对象的引用。这不是构造函数通常需要做的事情,但有时(例如)你想要一些看起来像构造函数的东西来实际提供一个先前的实例而不是新的对象。
1 松散地说;对象在JavaScript中并不真正具有 type ,只是原型继承谱系。
答案 1 :(得分:1)
对象一般没有名称。您所看到的是对象的依赖于实现的字符串化。 Firefox控制台将显示
Object { x: "hi" }
Chrome可能会显示该对象的构造函数的名称。函数确实有一个名称。