2017-09-05 12 views
0

私はJavaScriptのプロトタイプ継承をかなりよく理解していますが、完璧だとは言いません。私はJavaScriptの継承のための最新のプロトタイプの構文を見ていますが、これまではかなり良い意味合いがあります。JavaScript ES5のプロトタイプ継承でサロゲートクラスが必要なのはなぜですか?

__proto__は、親関数のprototypeを検索するために使用されます。私がCatMammalを持っていると言うと、私は単純にCat.prototype.__proto__Mammal.prototypeと指し示すことができます。

ChildClass.prototype.__proto__ = ParentClass.prototype; 
ChildClass.prototype.constructor = ChildClass; 

__proto__の使用それはごく最近まで、標準化されていなかったので、強くお勧めしました。このように、現代の標準化された練習はChildClassのプロトタイプを変更することも変更されますので、今度は、ES5の代理アプローチで

明らか
function Surrogate() {}; 
Surrogate.prototype = ParentClass.prototype; 
ChildClass.prototype = new Surrogate(); 
ChildClass.prototype.constructor = ChildClass; 

を見てみましょう、

ChildClass.prototype = ParentClass.prototype; 

は、悪いですObject.create

ChildClass.prototype = Object.create(ParentClass.prototype); 
ChildClass.prototype.constructor = ChildClass; 

を使用することですParentClassのプロトタイプ

しかし、なぜこれを行うことはできませんか?

なぜサロゲートが必要ですか?

+2

あなたの「ES5のサロゲートアプローチ」は完全に正確ではないと私は思います。 2011年に 'Object.create'が' 5.1'に追加されたので、現代JSが行くまでは非常に長い時間がかかりました。 – loganfsmyth

+0

'new'が使用されました*前に* ES5は' Object.create'を導入しました。 – Bergi

答えて

1

なぜこれを行うことはできませんか?あなたは、W/O引数ParentClassコンストラクタを呼び出すことはエラーをスローしないことを知っていますどのように

ChildClass.prototype = new ParentClass();

ParentClassがこのように実装されたと想像してください。

+0

ああ、ありがとう、良い点!これがサロゲートクラスを行う唯一の理由ですか?私が知っておかなければならない他の隠された警告があり、代理トリックはキャッチするように設計されていますか? – cfeng

+0

@cfeng他の副作用 'ParentClass'でも可能です。たとえば、外部API、インクリメントカウンタなどを呼び出す可能性があります。 –

+1

@cfengコンストラクタをまったく呼びたくありません。何が初期化されるべきですか?周囲にはインスタンスがありません。 – Bergi

関連する問題