2014-02-27 23 views
0

是否有更好的方法來合併兩個對象並調用父函數?使用jQuery進行JavaScript繼承 - 調用父函數

var a = { 
    a:1, 
    myFunction:function(){ 
     console.info("a"); 
    } 
} 

var b = { 
    b:2, 
    myFunction:function(){ 
     console.info("b"); 
     this.callParent(); 
    } 
} 

var obj = {}; 
$.extend(obj, a); 
$.extend(obj, b); 
b = obj; 
b.superclass = a; 

包裹的所有功能,以便 「this.callParent」 是本

function wrap(func, parent) { 
    return function() { 
     this.callParent = parent; 
     var result = func.apply(this, arguments); 
     return (this.callParent), result; 
    }; 
} 

與迭代如:

$.each(b, function(key, value){ 
     if(typeof value == "function" && b.superclass && b.superclass[key]){ 
      b[key] = wrap(value, b.superclass[key]); 
     } 
}); 

具有輸出 「B - >一個」:

b.myFunction(); 

Demo

+3

'$ .extend()jQuery的一般和;'不會在JavaScript中與遺傳有關。所有'.extend()'都會合並2個對象,它對'prototype'或'prototype.constructor'不是很在意,也不會將'$ .extend(objA,objB)''objA instanceof objB'真正。說*使用jQuery *繼承JavaScript是非常具有誤導性的。 – Nope

回答

2

是否有更好的方法來合併兩個對象並調用父函數?

是的,用一個輔助功能在一個步驟中完成,而不是使用$.extend的flubbed方法。

請注意,jQuery的extend函數並沒有真正設置任何繼承,它只是可以用於mixin - 你不應該在引用該函數時使用術語「繼承」。此外,您的對象ab絕對不是「班級」,所以請不要將其命名爲.superclass。他們最好是單身。

您可以按照您的建議進行繼承,但請注意,它不是原型繼承,正如您期望的那樣。

function inheritObject(parent, child) { 
    for (var p in parent) 
     if (!(p in child)) 
      child[p] = parent[p]; // extend 
     else if (typeof child[p] == "function") (function(name, fn) { 
      child[name] = function() { // inherit 
       this.callParent = parent[name]; 
       var res = fn.apply(this, arguments); 
       delete this.callParent; 
       return res; 
      }; 
     }(p, child[p])); 
    return child; 
} 

var a = { 
    a:1, 
    myFunction:function(){ 
     console.info("a"); 
    } 
} 

var b = inheritObject(a, { 
    b:2, 
    myFunction:function(){ 
     console.info("b"); 
     this.callParent(); 
    } 
}); 
+0

謝謝,正是我在找:) – Stevanicus