JavaScriptの中のprototypeとconstructorは簡明に総括します。


一、コンストラクタの値は一つの関数です。JavaScriptでは、nullとundefined以外のタイプの値、配列、関数、およびオブジェクトは、constructor属性があります。constructor属性の値はこの値、配列、関数、またはオブジェクトのコンストラクタです。
var a = 12, //   
    b = 'str', //
    c = false, //
    d = [1, 'd', function() { return 5; }], //
    e = { name: 'e' }, //
    f = function() { return 'function'; }; //

console.log('a: ', a.constructor); // Number()
console.log('b: ', b.constructor); // String()
console.log('c: ', c.constructor); // Boolean()
console.log('d: ', d.constructor); // Array()
console.log('e: ', e.constructor); // Object()
console.log('f: ', f.constructor); // Function()
以上のコンストラクタはすべてJavaScriptに内蔵されています。私達もカスタムコンストラクタを作ることができます。
コンストラクタを呼び出すとき、newキーワードを使います。コンストラクタはオブジェクトを返します。下のコードを見れば分かります。
二、プロトタイプは関数の属性の一つで、デフォルトでは関数のプロトタイプ属性の値は関数と同名の空のオブジェクトで、匿名関数のプロトタイプ属性はObjectと呼ばれています。

function A(name) {
    this.name = name;
}

var a = new A('a');

console.log(a.constructor); // A(name)
prototype属性は主にJavaScriptにおける継承を実現するために用いられます。
ここに問題があります。testの構造関数はB関数ではなくA関数です。
var a = 4;
var b = new Number(4);

console.log('a: ', typeof a); // a: number
console.log('b: ', typeof b); // b: object
これはB.prototype=A.prototypeがB.prototypeの構造関数をAに変えたので、B.prototypeの構造関数を復元する必要があります。
なぜこのようにするかというと、プロトタイプの値はオブジェクトであり、そのコンストラクタ属性の値はその関数であるからです。