2016-08-18 65 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)' –