2011-10-10 53 views
7

經過多年在JavaScript中使用原型繼承創建應用程序之後,我開始探索使用寄生繼承。儘管在創建對象層次結構時可能會在內存中創建若干個方法副本,但它的主要缺陷 - 至少對我來說是這樣 - 我發現它的真實性引起了我的共鳴,其簡單性和「新」變得沒有必要。但是,我堅持「這個」發生了什麼。大部分我在網上看到的例子只是淺嘗輒止展示如何實現寄生繼承,像這樣:「this」在JavaScript寄生繼承中引用了什麼?

function foo() { 
     return { 
      method1 : function() {...} 
     } 
    } 

    function bar() { 
     var that = foo(); 
     that.method2 = function() { 
      //is "this" pointing to bar()? 
     } 
     return that; 
    } 

當我問在欄()對象的意見,並「這」指杆( )還是這個降級到method2的範圍?

謝謝!

回答

3

快速測試表明this正確是指由bar返回的對象:

function foo() { 
    return { 
     method1 : function() { return "spam" } 
    } 
} 

function bar() { 
    var that = foo(); 
    that.method2 = function() { 
     return this.method1(); 
    } 
    return that; 
} 

var b = bar(); 
b.method2(); // "spam" 
+0

不錯。謝謝!現在我可以前進。這只是一個概念上的飛躍,已經完成了原型繼承了很長時間。寄生遺傳是很熟悉的,但是我承認有點不舒服 - 但這是一件好事! :) –

1

this context variablemethod2()將被綁定到該對象,它會從foo()僞構造函數返回。每個函數(上下文)都有一個綁定的this,來自上下文變量的值取決於來自方法本身的調用。

例如,從一個對象調用一個函數作爲屬性(就像你在那裏做的那樣)將會把this variable設置爲該對象。當你立即調用一個函數時,其this綁定到ES3中的global object和ES5中的null

還有其他的方法和關鍵字可以更改從this的值。像new,.bind(),.call().apply()。但是,再次,在您的特定片段中,this將被綁定到存儲在that中的對象。

+0

思想的解釋,但什麼是ES3和ES5? – CapelliC