2011-09-02 54 views
8

我現在處於一個新的領域,我有一段時間沒有與這類事情合作過。擴展一個函數 - 合併兩個函數?

什麼是有一個JavaScript「類」比如最好的辦法

// In the parent instance 
function xyz() 
{ 
    var x = 1; 
} 

我想設置這樣的類,當用戶擴展一個類,我希望他們能夠有效地擴展這個功能。我知道我不清楚,但這是漫長的一天。例如,這是用戶的代碼。

// In the child instance 
function xyz() 
{ 
    var y = 2; 
} 

合併不應導致:

// In the merged instance 
function xyz() 
{ 
    var x = 1; 
    var y = 2; 
} 

上午我吸菸了錯誤的東西,或者問錯了問題?

+2

請保持吸菸相同的東西:) – JoeyC

回答

8

當你在那裏描述它們時,你不能「合併」函數,但是你可以做的是重新定義一個函數來調用它本身和一個新函數(在原始函數之前或之後)。

var xyz = function(){ 
    console.log('xyz'); 
}; 

var abc = function(){ 
    console.log('abc'); 
}; 

// and, elsewhere, if you want to merge: 
var orig = abc; 
abc = function(){ 
    orig.call(this, arguments); 
    xyz.call(this, arguments); 
}; 

列入(這一點,參數),如果你不關心執行上下文或者如果調用的函數沒有參數,則不需要。但是我清楚地說明了如果你想要一個參數化方法可以做什麼。

8

你用jquery標記問題,所以我假設你使用jquery。與jQuery,你可以合併對象與jQuery.extend()

var object1 = { 
    apple: 0, 
    banana: {weight: 52, price: 100}, 
    cherry: 97 
}; 
var object2 = { 
    banana: {price: 200}, 
    durian: 100 
}; 

/* merge object2 into object1 */ 
$.extend(object1, object2); 

或使用原型鏈來實現繼承。例如:

function a() { 
    this.t1 = 1; 
    this.sayMyName = function() { 
     alert('a'); 
    } 
} 
b.prototype = new a; 
b.prototype.constructor = b; 
function b() { 
    this.t2 = 2; 
    this.sayMyName = function() { 
     alert('b'); 
    } 
} 
var obj = new b(); 
alert(obj.t1); // this would say 1 
obj.sayMyName(); // this would say b 
+0

原型鏈是我感興趣的 - 我做了一些快速閱讀原型,但它沒有進入功能。你知道這有什麼好的閱讀嗎? –

+0

在javascript中有多種實現類/繼承的方法。這裏有一些關於面向對象的javascript的文章。 [定義JavaScript類的3種方式](http://www.phpied.com/3-ways-to-define-a-javascript-class/)[JavaScript中的面向對象編程](http://mckoss.com /jscript/object.htm)[JavaScript中的古典繼承](http://www.crockford.com/javascript/inheritance.html)希望這有助於:) – ntangjee

0

如果我理解正確的話,你可以嘗試重命名原來的功能和新功能中調用它:

MyClass.prototype.old_xyz = MyClass.prototype.xyz; 
MyClass.prototype.xyz = function() { 
    this.old_xyz(); 
} 

// In the parent instance 
function xyz() 
{ 
    var x = 1; 
} 

// In the child instance 
var old_xyz = xyz; 
function xyz() 
{ 
    var y = 2; 
    old_xyz(); 
} 

與類/方法的繼承,也適用此