いいえ、あなたは混乱しています。なぜなら、継承を実現する方法の 1 つ (つまり、プロトタイプ継承) が、プロトタイプとして、特定のオブジェクトを取るからです。オブジェクトを取得する 1 つの方法は、コンストラクターを使用することです。
つまり、特別なことは何もありませんsomeObject.prototype = new SomeOtherObject()
。あなたも同じようにできる
someObject.prototype = { myObjectLiteral: "isJustAsGoodAsYourConstructoredInstance" };
またはさえsomeObject.prototype = false
。この 2 つの操作は、文字通り、互いに何の関係もありません。
編集彼の本にある引用OPに対処するには:
「コンストラクター、プロトタイプ、およびインスタンス間の関係を思い出してください。各コンストラクターにはコンストラクターを指すプロトタイプ オブジェクトがあり、インスタンスにはプロトタイプへの内部ポインターがあります。」
残念ながら、これはせいぜい誤解を招くだけであり、最悪の場合は明らかに間違っています。「各コンストラクターには、コンストラクターを指すプロトタイプ オブジェクトがある」という意味を考えてみましょう。たとえば、
Array.prototype === Array
Function.prototype === Function
function CustomConstructor() { }
CustomConstructor.prototype === CustomConstructor
ただし、これらのステートメントはすべてfalse
、コンソールに入力すると出力されます。
ここで、「インスタンスはプロトタイプへの内部ポインターを持っている」と考えてください。これは真実ですが、彼が使用している用語には適合しません。これが意味することは次のとおりです。
var myProto = {};
function CustomConstructor() { }
CustomConstructor.prototype = myProto; // inherit from the myProto object.
var x = new CustomConstructor(); // x is an "instance"
Object.getPrototypeOf(x) === myProto; // Object.getPrototypeOf fetches the "internal pointer"
しかし、ご覧のとおり、上で指摘したように、コンストラクターを使用して継承しませんでした。オブジェクトのインスタンス化は、決して継承ではありません。コンストラクターのプロパティは、Java でクラス定義の後にprototype
配置することによって古典的な継承が達成されるのと同じように、プロトタイプの継承がどのように達成されるかということです。プロトタイプ継承では、基本クラスではなく、プロトタイプオブジェクト インスタンスを継承できるextends BaseClass
ため、この違いが存在します。
JavaScript ガーデンには、より多くの情報が必要な場合に役立ついくつかの優れたセクションがあります。関連するのは、「プロトタイプ」、「コンストラクター」、および「インスタンスのオペレーター」です。