web-dev-qa-db-ja.com

継承のためにプロトタイプをコピーしますか?

私はJavaScriptで遊んでいました。特に、クラスなどを使用してオブジェクト指向プログラミングをシミュレートしていました。

私はこの継承を達成する方法を知っていました

MyClass.prototype = new AnotherClass();

しかし、私は満足していませんでした。AnotherClassのコンストラクターを呼び出す方法が気に入らなかったのです。それで私は遊んでいて、うまくいくようで、基本的にセカンドオピニオンが欲しいものを思いついた。

function clone (obj)
{
    function CloneFactory () {}
    CloneFactory.prototype = obj;

    return new CloneFactory();
}

MyClass.prototype = clone(AnotherClass.prototype);

プロトタイプのクローンを作成することにより、その新しいコピーを取得し、それをMyClassのプロトタイプに割り当てて、継承されたプロパティを変更しても親のプロトタイプのプロパティに影響を与えないようにします。このようにMyClass.prototype = AnotherClass.prototype

私はストレステストを実行しましたが、これは特定の状況下でより効率的です。つまり、親のコンストラクターに多くのコードがある場合、それ以外の場合はほぼ同じです。もう1つの利点(または少なくとも私はそれが有益であると思う)は、サブクラスから情報をある程度隠すことができることです。特権メソッドとメンバーは継承されません。

私が見落としている大きな落とし穴はありますか?

私はJavaScriptの専門家ではありませんが、実際にはJavaScriptにかなり慣れていないので、Googleで何も見つからないようですので、セカンドオピニオンをお願いします。私は悪いコードを実装したくありません:)!

18
SpaceFace

これはほぼまさにObject.createが行うことです。あなたが書いた関数は、そのメソッドのかなり標準的な「ポリフィル」です。

これは、「真の」プロトタイプの継承をより厳密に反映する方法でオブジェクト作成を抽象化する非常に一般的な方法です。物事を行うための間違いなく安全な方法。

ああ、興味があれば、Object.createのMDNエントリへのリンクは次のとおりです: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create/

下部に、実際にはポリフィルが含まれていることがわかります。これは、いくつかの安全性チェックと変数名を除いて、コードとほとんど同じです。

22
Kevin Ennis