0

protype は、内部プロトタイプ プロパティが Object.prototype に設定され、コンストラクタ プロパティを持つオブジェクトです。

x=new Object;//

プロトタイプは関数 Object のインスタンスでもあるが、コンストラクタ プロパティがあるためです。

私の質問は、プロトタイプはオブジェクト関数のインスタンスでもあり、空のオブジェクト({})もオブジェクト関数のインスタンスであるため、コンストラクターと呼ばれるプロパティがなく、プロパティが1つある.なぜそうなのですか?

4

1 に答える 1

2

編集前

x にはコンストラクタ プロパティがありません

はい、そうです。から継承していObject.prototypeます。

このコード:

var x = new Object();
console.log("typeof x.constructor = " + typeof x.constructor);

...出力しますtypeof x.constructor = function実例| ソース

編集後

x は独自のコンストラクター プロパティを持たなくなりました

(私の強調)

( is ) と呼ばれる独自のプロパティはありません。それを持つ理由がないためです。これはプロトタイプにあります。constructorx.hasOwnProperty("constructor")false

オブジェクトとそのプロトタイプの間のリンクはライブリンクであることを認識することが重要です。オブジェクトはプロトタイプのコピーを取得せず、プロトタイプへの参照を取得します。オブジェクトからプロパティを取得するとき、オブジェクトにその名前の独自のプロパティがない場合、プロトタイプへの参照に従って、プロトタイプにそのプロパティがあるかどうかを確認します (プロトタイプ チェーンをたどって、Object.prototype)。これがプロトタイプ継承の要点です。オブジェクトはプロトタイプのプロパティのコピーを持たず、プロトタイプから継承します。

ライブリンクの例を次に示します。

function Foo() {
}
Foo.prototype.answer = 42;

var f = new Foo();
console.log("[before] f.question = " + f.question);
console.log("[before] f.answer = " + f.answer);

// Note that `f.question` is undefined, of course, as we haven't defined it

Foo.prototype.question = "Life, the Universe, and Everything";

console.log("[after] f.question = " + f.question);
console.log("[after] f.answer = " + f.answer);

// Note that `f.question` is defined now, even thoguh `f` was created
// BEFORE we added that to the `Foo.prototype`.

実例| ソース


あなたのコメントについて:

私の質問は、プロトタイプはオブジェクト関数のインスタンスでもあり、空のオブジェクト({})もオブジェクト関数のインスタンスであるため、コンストラクターと呼ばれるプロパティがなく、プロパティが1つある.なぜそうなのですか?

に割り当てられたオブジェクトだけObject.prototypeが実際にプロパティを割り当てられているためです。constructorこれは関数の作成の一部です (この場合Objectは ですが、どの関数にも当てはまります)。仕様の§13.2のステップ #17 を参照してください。経由で作成された他のすべてのオブジェクト (文字通りまたはその他の方法で)new Objectは、プロトタイプ チェーン経由でプロパティを受け取りますが、上の特定のオブジェクトにObject.prototypeは、そのプロパティが直接割り当てられています。

于 2013-01-28T05:28:51.657 に答える