2012-05-06 51 views
1

這似乎是許多人已經討論過的事情。但不幸的是,我找不到我的問題的答案。 這裏是Javascript繼承一段代碼(從一本書):Javascript中的「new」和「prototype.constructor」之間的關係是什麼?

function Car() { 
    var self = this; 
    self.type = "Car" 
    self.go = function() { 
     console.log("Going..."); 
    }; 
}; 

Toyota = function() { console.log("Original called"); }; 
Toyota.prototype = new Car(); 
Toyota.prototype.constructor = function() { 
    var self = this; 
    self.type = "Toyota"; 
    self.go = function() { 
     console.log("A Toyota car is going..."); 
    } 
}; 
Toyota.prototype.isJapaneseCar = true; 

function TestCar() { 
    console.log("Toyota.prototype.constructor: " + Toyota.prototype.constructor); 
    var t = new Toyota(); 
    console.log("t.constructor: " + t.constructor); 
    console.log(t.type); 
}; 

而且在Firefox控制檯輸出:

Toyota.prototype.constructor: function() { 
    var self = this; 
    self.type = "Toyota"; 
    self.go = function() { 
     console.log("A Toyota car is going..."); 
    }; 
    } 
Original called 
t.constructor: function() { 
    var self = this; 
    self.type = "Toyota"; 
    self.go = function() { 
     console.log("A Toyota car is going..."); 
    }; 
    } 
Car 

從輸出,它表明新豐田( )電話:

var t = new Toyota(); 

沒有援引Toyota.prototype.constructor的功能預期的,相反它還是叫首先定義的函數:

Toyota = function() { console.log("Original called"); }; 

一個post高給予好評數一起給了一個相當詳細的解釋與例子:它說:「3.執行構造函數,每當提到這一點時使用新的對象。 「那麼 」構造「:{(原稱爲」);

  • 豐田提到的參考prototype.constructor如何是與下面3條線

    1. 豐田=()函數的console.log}?「。 prototype.constructor =函數(){...
    2. 變種T =新豐田();

    [編輯]什麼最讓我困惑就是爲什麼構造(Toyota.prototype.constructor)不是我nvoked當我打電話新豐田()

  • +1

    'Func.prototype.constructor'應該只指向'Func'。你的情況下的構造函數是'豐田'。 –

    回答

    2

    prototype中的constructor屬性對象包含對構造該類型對象實例的函數的引用。希望我不想在這裏混淆。

    對於一個String對象,你會看到constructor屬性引用String功能(又名構造非正式)

    console.log("".constructor); // would print function String() { [native code] } 
    

    這就是爲什麼我們通常會重新分配類(即功能)constructor屬性的擁有。

    Toyota.prototype.constructor = Toyota; 
    
    var t = new Toyota(); 
    console.log(t.constructor); // prints function Toyota() { /* definition */ } 
    

    希望能回答你的問題。

    +0

    最讓我困惑的是爲什麼當我調用新的豐田()時不會調用構造函數(Toyota.prototype.constructor)? –

    +0

    讓我澄清一下,在實例化新對象時,沒有使用'constructor'屬性。如果你需要的話,你需要使用'prototype'對象來說'Toyota.prototype = new Honda();'。在這種情況下,它是一個原型鏈,無論何時您創建一個「豐田」對象,您都會獲得一個「本田」對象。這是繼承如何在JavaScript中完成的。 – g13n

    +0

    首先感謝您的回答和評論!有一件事我仍然感到困惑:我調用'new Toyota()'時仍然會調用一些函數(在我的例子中:'function(){console.log(「Original called」);}')。這個功能在'豐田'裏保存在哪裏?我如何'重寫'它? 「構建該類型對象的實例的函數」(在你的答案中)是什麼意思? –

    相關問題