4

私は JavaScript の本を読んでいて、継承に関する章を読んでいて、オブジェクトのインスタンスを作成するたびに本当に継承が行われるのだろうかと疑問に思いました。特にそれらは似ているためです。

例: プロトタイプ連鎖 -someObject.prototype = new someOtherObject();

オブジェクトのインスタンス化var myArray = new Array()

似てますよね?

さらに、この本 (Web 開発者向けの JavaScript、作成者: Nicholas Zakas) には、インスタンスとコンストラクターのプロトタイプの間にリンクが存在すると述べられています (リンクは通常 として知られています__proto__) 。

では、オブジェクトのインスタンス化は継承のようなものだと主張できますか?

4

2 に答える 2

2

いいえ、あなたは混乱しています。なぜなら、継承を実現する方法の 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 ガーデンには、より多くの情報が必要な場合に役立ついくつかの優れたセクションがあります。関連するのは、「プロトタイプ」、「コンストラクター」、および「インスタンスのオペレーター」です。

于 2011-06-18T04:22:26.853 に答える
1

objectType.inherits() を使用せずに、継承の概念を理解した場合は、適切な部分だけを使用する必要があります。

new someOtherObject()

これは someOtherObject のインスタンス化です。

ここで起こることは、空のオブジェクトから構造を継承する someOtherObject 型のオブジェクトを作成していることです (これにプロトタイプを設定していない場合)。プロトタイプのデフォルト値は空のオブジェクトであるためです{}

このオブジェクトを のプロトタイプとして配置していますsomeObject:

someObject.prototype = new someOtherObject();

someObject のインスタンスを作成すると、次のようになります。

その時点で someOtherObject の構造を継承する someObject を作成します。これは、インスタンス化されたときに (空の) オブジェクトの構造を継承します。

おそらく、インスタンスはその時点でのプロトタイプの構造で拡張され、それを使用するだけで誤解を招く可能性があるため、継承の言葉遣いはすべて脇に置いておくと言う方が良いかもしれません。従来の継承は基本クラス (型) を使用し、proto はそれらのインスタンスを使用するためです。カール・マルクスが主張するように、継承はJavaScriptにはまったく存在しません(オブジェクト型は実行時に変更可能です)。これは、概念では真の共産主義はまったく不可能であると主張しています。この最後のステートメントに同意する場合、それについて比較して質問することは重要ではありません。

于 2011-06-18T04:23:38.360 に答える