2012-10-17 164 views
1

當試圖單獨執行以下兩個代碼塊: 第一招:JavaScript構造函數

function Hallo() { 

} 
var some_obj = { 
    name: "Fred", 
    age: 23, 
} 
Hallo.prototype = some_obj; 
var obj = new Hallo(); 
obj.constructor; 

,第二個:

function Hallo() { 

    } 
    Hallo.prototype.name = 'Khanh'; 
    Hallo.prototype.age = 23; 
    var obj = new Hallo(); 
    obj.constructor; 

我得到的結果在Firebug的控制檯「對象{}「,第二個是」Hallo()「。 雖然第二個很容易理解,但第一個很奇怪。因爲我知道第一個obj Object的構造函數仍然是相同的(即Hallo()函數)。 但是我得到了Object()函數的結果。 我真的不明白爲什麼。你能幫我嗎? 謝謝!

+0

你覆蓋在第一個例子整個'prototype',但在第二個你只增加兩個新的屬性。 – Blender

+0

是的,我知道,但構造函數仍然是一樣的,不是嗎?我關心構造函數。 –

+1

當您覆蓋*整個*原型時​​,'構造函數'被您的對象的構造函數覆蓋。 – Blender

回答

2

的原因是:

當你這樣做var obj = new Hallo();,然後

console.log(obj.constructor === Hallo.prototype.constructor); // true 

在第一個示例中,您爲Hallo.prototype分配了一個新對象,該對象的constructor爲函數Objectfunction Object(){...})。

在第二個例子中,Hallo.prototype.constructor仍然function Hallo() {...}

+0

感謝xdazz,我測試過你用螢火蟲回答。是的,它完全按照你的說法回報。所以,如果我這樣做:var obj = new Hallo(),obj的構造函數不是真正的Hallo()函數,而是始終是Hallo.prototype構造函數。然而,我讀了一本叫做Object Oriented Javascript的書,它說:如果我這樣做:var obj = new Hallo(),那麼obj Object就是由Hallo()構造函數創建的。所以它與你的答案不同。你能解釋一下這個混亂嗎? –

1

原型將得到指向默認構造函數的引用,詮釋您覆蓋原型some_obj第一功能,同時構造引用更改爲some_obj的構造參考--Object的構造函數對象()