編集前
x にはコンストラクタ プロパティがありません
はい、そうです。から継承していObject.prototype
ます。
このコード:
var x = new Object();
console.log("typeof x.constructor = " + typeof x.constructor);
...出力しますtypeof x.constructor = function
。実例| ソース
編集後
x は独自のコンストラクター プロパティを持たなくなりました
(私の強調)
( is ) と呼ばれる独自のプロパティはありません。それを持つ理由がないためです。これはプロトタイプにあります。constructor
x.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
は、そのプロパティが直接割り当てられています。