2014-09-11 131 views
1

havng這樣的代碼:爲什麼原型必須在構造函數之外聲明?

function A(){ 
    var a=7; 
    this.fun = function(){ 
    return a*2; 
    } 
} 

function B(){ 
    var a =8; 

} 

是obvous,爲了refernce乙原型到一個我們需要添加一行:

B.prototype = new A(); 

我徘徊爲什麼它是不是有效的使這樣的代碼:

function A(){ 
    var a=7; 
    this.fun = function(){ 
    return a*2; 
    } 
} 

function B(){ 
    var a =8; 
    this.prototype = new A(); 
} 

當我們需要把裏面的原型宣言B,我們需要通過使它:

function B(){ 
    var a =8; 
    this.__proto__ = new A(); 
} 

和這樣的代碼將無法正常工作:

function B(){ 
    var a =8; 
} 
B.__proto__ = new A(); 

,現在我失去它 - 它爲什麼是這樣呢?爲什麼我們必須在一個函數之外聲明原型,並且我們不能在其中聲明它,爲什麼它只是與proto相反?

回答

0
1) var A = function() { 
    this.x = function() { 
     //do something 
    }; 
}; 

2) var A = function() { }; 
    A.prototype.x = function() { 
    //do something 
    }; 

在第一種情況下,變量A被分配一個值,該值是對函數的引用。當使用A()調用該函數時,該函數不會由調用設置,因此它默認爲全局對象,並且表達式this.x有效地爲window.x。結果是對右側的函數表達式的引用被分配給了window.x。

在第二種情況下,在第一行中,變量A被分配了對函數的引用。在JavaScript中,所有的函數對象默認都有一個prototype屬性,所以沒有單獨的代碼來創建一個A.prototype對象。在第二行中,A.prototype.x被賦予一個函數的引用。這將創建一個x屬性(如果它不存在),或者如果它存在,則分配一個新值。因此,與第一個示例的區別在於表達式中涉及哪個對象的x屬性。

+0

你是聰明人Swetha!謝謝:) – user3759790 2014-09-11 11:57:22

+0

如果您對答案感到滿意,請將問題標記爲已接受:) – Swetha 2014-09-11 11:58:53

相關問題