2015-05-24 58 views
0

我設法聚集一原型對象到的JavaScript普通對象:的jQuery與原型對象擴展對象

var ModuleA = function(data) { 
    this.data = data; 
}; 

ModuleA.prototype.funcA = function() { 
    alert(JSON.stringify(this)); 
} 

var myMainObject = { 
    list: [] 
}; 

$.extend(myMainObj <--------- ???ect, new ModuleA('Haha')); 

myMainObject.funcA(); 

現在myMainObject將數據屬性和funcA功能,因爲我合併到myMainObject

當我執行myMainObject.funcA時,這個參數實際上是myMainObject

據我瞭解,當新建一個原型對象時,函數會綁定到用new創建的對象並傳遞給構造函數。

但與jQuery擴展,這個參數不是新的對象,但指向myMainObject,這使我困惑。

有什麼想法嗎?

+0

你可以在這裏嘗試一下,http://jsfiddle.net/5oyqq6qa/ – ZeroX

+0

我的實際意圖是讓ModuleA功能都有自己的範圍而不混雜了與myMainObject屬性。 – ZeroX

回答

1

當我執行myMainObject.funcA時,這個參數實際上是myMainObject!

沒錯。這就是this在JavaScript中的工作原理。該表達式:

myMainObject.funcA(); 

中查找funcA財產上myMainObject,取回一個函數的引用,然後調用該函數,調用該對象,它由(myMainObject)得到了功能過程中設置this。這是this分配的正常方式。

如果你想this別的東西,你可以用Function#bind創建一個函數與this烤成,或Function#callFunction#apply使用特定this值調用一個函數,但你可能不希望在您的方案中。

更多關於this(我的博客)


請回復您的評論:

我的實際意圖是讓ModuleA功能已經沒有了混亂與myMainObject屬性

自己的範圍,那麼請不要混亂ModuleAmyMainObject。聽起來像是你想組成代替:

var myMainObject = { 
    list: [], 
    moda: new ModuleA() 
}; 

myMainObject.moda.funcA(); 
+0

哇,我不知道JavaScript做了不同於綁定函數 – ZeroX

+0

雅,組成是另一種方式。我的場景是讓我的對象從PublishSubscribe對象繼承,它將具有訂閱和派發Event給所有訂閱者的功能。組成要求客戶代碼知道在哪裏可以找到該功能,哪個不太合適。 – ZeroX

0

$.extend不調用構造函數,它只是複製對象的數據。從documentation

屬性是經由新MyCustomObject(參數)構造的對象,或內置的JavaScript類型,如日期或正則表達式,不重新構造和將顯示爲在所得到的對象平原對象或數組。

對於不屬於此行爲的需求,請改爲編寫自定義擴展方法,或者使用像lodash這樣的庫。