2017-12-08 6 views
0

は、インスタンスの継承の基本的な例です:あなたが行の前に、両方のケースでは、見ることができるようにJavaScript継承、プロトタイプコンストラクタをリセットしますか?ここ

function A() { 
    this.props = { 
     a: 'a', 
     b: 'b' 
    } 
} 
A.prototype = { 
    fn: function() { 
     console.log(this.props); 
    } 
} 


function B() { 

} 
B.prototype = { 
    write: function() { 
     console.log('good') 
    } 
} 

/* 
    I don't think anyone advocates setting the prototype constructor 
    as the Function to which it belongs in this case. 
*/ 
console.log(B.prototype.constructor); // ƒ Object() { [native code] } 
B.prototype.constructor = B; 
console.log(B.prototype.constructor); // ƒ B() {} 

var b = new B(); 

function A() { 
    this.props = { 
     a: 'a', 
     b: 'b' 
    } 
} 
A.prototype = { 
    fn: function() { 
     console.log(this.props); 
    } 
} 


function B() { 
    A.call(this); 
} 


B.prototype = Object.assign(A.prototype, { 
    write: function() { 
     this.fn(); 
    } 
}); 

console.log(B.prototype.constructor); // ƒ Object() { [native code] } 
B.prototype.constructor = B; 
console.log(B.prototype.constructor); // ƒ B() { A.call(this); } 

var b = new B(); 

そしてここでは、継承せずに同じ機能の例です

B.prototype.constructor = B; 

プロトタイプコンストラクタはネイティブObjectコンストラクタであり、その後はプロトタイプが宣言されたObject/Functionです。

古いブラウザでは問題の行が必要ですか、人気のある悪い技術と戦う必要がありましたか、またはプロトタイプの継承を正しく行っていませんか?

+1

どちらの場合でも、新しいオブジェクトで 'B.prototype'を上書きしています。だから、 'コンストラクタ'がなくなった(あなたはそれをリセットしなければならない)。 'B.prototype = {constructor:B、write:...};'のように、 ''コンストラクタ ''のプロパティを 'B.prototype'に代入するオブジェクトリテラルに追加することができます。 –

答えて

1

おかげさまで、Ibrahimは、どちらの場合もB.prototypeを無効にしていたことを指摘してくれました。

1.

B.prototype = Object.assign(B.prototype, A.prototype, { 
    write: function() { 
     this.fn(); 
    } 
}); 

2.

B.prototype = Object.assign(B.prototype, { 
    write: function() { 
     console.log('good') 
    } 
}); 

はそのままオリジナルのプロトタイプのコンストラクタを残す必要があります。これを踏まえて

、いるようです。

+3

Object.assignはES2015仕様で定義されています。古いブラウザで使用する場合は、ポリフィルが必要です。また、関数を元のプロトタイプに直接添付しないでください。 (B.prototype.write = fun ...) –

関連する問題