2016-08-18 61 views
0

我刚开始阅读有关Javascript,我似乎无法找到这个问题的asnwer.Suppose我有一个函数称为test和一个匿名函数分配给一个变量说temp。我注意到,当我使用例2中的变量创建新对象实例时,没有分配__proto__?这是为什么使用新的变量分配了一个函数没有分配__proto__

function test() { 
 
    this.name = "testerName"; 
 
} 
 

 
var temp = function() { 
 
    this.name = "testeragain"; 
 
} 
 

 
// Example 1: 
 
var d = new test(); 
 
console.log(d.__proto__) //prints test{} 
 
console.log(d.__proto__ == test.prototype) //Returns false ? shouldnt this 
 
// Example 2: 
 
var d = new temp(); 
 
console.log(d.__proto__) //prints {} ?Why is this?

我正在使用命令node test.js

+0

因为您的调试器选择不命名它。注意,'d'都从它们各自的原型继承而来 - 你将得到相同的结果'console.log(test.prototype); console.log(temp.prototype);' – Bergi

+1

你应该使用'Object.getPrototypeOf(d)'。 '__proto__' getter已被弃用。 – Bergi

+0

@Bergi我尝试使用'Object.getPrototypeOf(d)',我得到相同的结果。那可能是因为我使用节点来运行js文件? –

回答

4

没有__proto__我的文件分配?

当然是了。在这两种情况下,d.__proto__都会返回原型。区别仅在于console.log选择如何渲染该值。如果您使用console.dir,您应该看到这些对象(几乎)相同。

这里是一个演示console.log输出可如何不同的例子:

> console.log({constructor: function foo() {}}); 
foo { constructor: [Function: foo] } 

> console.log({constructor: function bar() {}}); 
bar { constructor: [Function: bar] } 

> console.log({constructor: function() {}}); 
{ constructor: [Function] } 

你看到的对象基本上是相同的,除了分配给constructor的功能有不同的(或没有)的名字呢?

console.log只是将对象的表示用constructor.name的值作为前缀。

打印{}?这是为什么?

控制台试图推断对象的“类型”。由于第一个函数的名称为,因此名称(测试)将使用该名称作为输出中的“类型”。

第二个函数没有名称,所以它不知道要显示什么。

更具体

console.log(d.constructor.name) 

将记录"test"用于第一功能和所述第二功能的空字符串("")。

console.log的行为不是标准化的,并且输出可以在浏览器 JavaScript环境中有所不同。在功能上,两个例子都是相同的。

+0

是的,我正在使用节点运行js示例 –

+0

感谢清除在那种情况下不会'console.log(d .__ proto__ == test.prototype)' –