1

私はJavascriptのプロトタイプの継承を学んでおり、htmlページの本文のタグに次のものがあります。

function F() {}
//F.prototype = {a:"hello"};
var x = new F();
document.write(x.constructor);

これにより、ブラウザに次の出力が表示されます。

関数F(){}

ただし、2行目のコメントを外すと、次のようになります。

function Object(){[ネイティブコード]}

それでも、x最後の行を次のように変更すると、Fのプロトタイプから継承されます...

document.write(x.a);

...次のプリントアウトが表示されます。

こんにちは

FirefoxとSafariでこれを試しましたが、どちらでも同じことが起こります。

一体何がここで起こっているのか誰かが知っていますか?

4

2 に答える 2

1

各オブジェクトはconstructor最終的に から継承するため、各オブジェクトのプロトタイプ チェーンにはプロパティがありますObject.prototype

のプロトタイプとしてプレーン オブジェクトを設定したためF、はそのオブジェクトのプロパティをx.constructor参照しています。これは を参照しています。constructorObject.prototype.constructor

プロトタイプ チェーンは次のようになります。

x -> F.prototype -> Object.prototype

どちらxもプロパティを持たないため、 の値F.prototypeが返されます。constructorObject.prototype.constructor

オーバーライドする前の値F.prototypeは次のようになります。

F.prototype = {
    constructor: F;
};

つまり、constructorプロパティを持っています。そのため、プロトタイプをオーバーライドする場合は常にconstructor適切に設定する必要があります。

F.prototype = {a:"hello"};
F.prototype.constructor = F;
于 2012-08-01T15:10:04.720 に答える
0

これは、元のオブジェクト.constructorを置き換えたときに、既定のプロパティを削除したためです。.prototype

したがって、プロパティを探すとき.constructorは、指定されたオブジェクトのプロトタイプ チェーンを.prototypeたどり、それが見つかるまで続けます。これは default から取得されますObject.prototype

オブジェクトが置き換えられた場合.prototype、欠落しているオブジェクトを再割り当てすることを好む人もい.constructorます...

function F() {}
F.prototype = {a:"hello"};
F.prototype.constructor = F;
于 2012-08-01T15:10:20.603 に答える