2016-10-31 6 views
0

ダンプに関するご質問は申し訳ありません。私はf2()の機能をD "class"に上書きしたいと思います。しかし何らかの理由でFire Foxが私に言った: "あまりにも多くの再帰"。再帰が起こる場所と、このコードを期待通りに動作させる方法を教えてください。JS継承の例:再帰が多すぎます

var B = function() { 
}; 
B.prototype.f2 = function (x) { 
    return 2 * x; 
}; 

var C = function() { 
    B.call(this); 
}; 

var D = function() { 
    C.call(this); 
}; 

D.prototype.f2 = function (x) { 
    return C.prototype.f2.call(this, x) * 7; 
}; 

inherit(B, C); 
inherit(C, D); 

function inherit(Child, Parent) { 
    Child.prototype = Object.create(Parent.prototype); 
    Child.prototype.constructor = Child; 
} 

var d = new D(); 
console.log(d.f2(3)); 
+2

私は(興味これに基づいて、少なくとも1つのot彼女のあなたの質問は私が答えた)。上記の '継承'関数は時代遅れです。 ES2015では、このためのシンプルで明確な宣言的な構文があり、それをまだサポートしていない古い環境でもその構文を単純化することができます。 **その構文で理解するのはずっと**簡単です。だから、この古い方法を研究することは、最適ではないようです。 –

+0

*(not my dv ...)* –

+0

ありがとう、あなたの答えは非常に有用です!私はjsの古典的なoopパターンについての訓練に出席し、私たちはES5とES2015の2つの方法でそれを実装するように求められました。しかし、私はあなたが言っていることを見ている、それは理にかなって、jsの世界を作り、私がちょうど知り合いになった、より明確になる。 –

答えて

4

2つの問題は:

  1. あなたは、あなたがそれらにプロパティを追加しようとXYZ.prototypeオブジェクトを設定する必要があります。あなたのinherit関数がそれらを作成するので、あなたが正しい順序で何かをすることを確認する必要があります。

  2. inheritコールでは、親と子の順序が逆になります。それはinherit(child, parent)であり、inherit(parent, child)ではありません。

var B = function() { 
 
}; 
 
B.prototype.f2 = function (x) { 
 
    return 2 * x; 
 
}; 
 

 
var C = function() { 
 
    B.call(this); 
 
}; 
 
inherit(C, B);   // *** Moved and updated 
 

 
var D = function() { 
 
    C.call(this); 
 
}; 
 
inherit(D, C);   // *** Moved and updated 
 

 
D.prototype.f2 = function (x) { 
 
    return C.prototype.f2.call(this, x) * 7; 
 
}; 
 

 
function inherit(Child, Parent) { 
 
    Child.prototype = Object.create(Parent.prototype); 
 
    Child.prototype.constructor = Child; 
 
} 
 

 
var d = new D(); 
 
console.log(d.f2(3));

ES2015のバージョンは、比較のために:あなたはとても熱心ES5のプロトタイプチェーンを勉強している理由

class B { 
 
    f2(x) { 
 
    return 2 * x; 
 
    } 
 
} 
 

 
class C extends B { 
 
} 
 

 
class D extends C { 
 
    f2(x) { 
 
    return super.f2(x) * 7; 
 
    } 
 
} 
 

 
const d = new D(); 
 
console.log(d.f2(3));

関連する問題