1

新しいオブジェクトが構築されると、オブジェクトは、コンストラクターのプロトタイプに明示的に設定されていないプロパティを委任するように設定されます。つまり、後でプロトタイプを変更しても、インスタンスの変更を引き続き確認できます。

最初:

 function Foo(){}
 foo=new Foo();
 Foo.prototype={};
 foo.constructor==Foo//true.why is this happening since construtor prototype is empty object 

そのため、ステートメントは定義どおりに機能していません。正しいか間違っていますか? しかし、私がこれを行うと、結果は異なります

2番目:

 function Foo(){}
  Foo.prototype={};
 foo=new Foo();

 foo.constructor==Foo//false as aspected

再び3番目:

  function Foo(){}
  Foo.prototype={};
   Foo.prototype.name="Maizere";
 foo=new Foo();

 foo.name==Maizere//true.The definition at the top is applying here,if so why the definition not working in the first: example

簡単な英語を手伝ってください.imは本当に頭が痛いです。

4

2 に答える 2

3

なぜこうなった

newオペレーターは、インスタンスの継承を、コンストラクターのプロパティが現在指しているオブジェクトに設定しますprototype。だからあなたがするとき

function Foo() {}
var foo = new Foo;

それ以降に誰かが代入してFoo.prototypeも意味がありません - それは変わりませんfoo

  • 最初:取得している継承constructorされたプロパティは、「古い」プロトタイプからのものです-関数とともに初期化され、その隠し「コンストラクター」プロパティを持つオブジェクト
  • 2番目:prototype空のオブジェクトでプロパティを上書きしており、foo(上書き後に作成された)それを継承しています。また、空のオブジェクトは から継承するためObject.prototype、プロパティは関数constructorを指すようになりました。Object
  • 3番目: 繰り返しますがfoo、上書きしてから作成しますprototypename継承元の新しいオブジェクトにプロパティを割り当てるため、同様fooにアクセスできます。foo
于 2013-01-27T17:32:17.687 に答える
1

関数を作成すると、関数自体に設定されたプロパティprototypeを持つオブジェクトという名前のプロパティが付属します。constructorご存知かもしれませんが、JavaScript のオブジェクト モデルはプロトタイプ ベースです。prototypeこれにより、その関数で作成したオブジェクトは、そのコンストラクター関数 (で呼び出す関数) のすべてのプロパティを継承します。そのため、オブジェクトを作成する瞬間にnew注意する必要prototypeがあります。

最初のケースでは、のprototypeプロパティをFoo空のオブジェクトに設定しているだけです。しかし、オリジナル (デフォルト)prototypeはまだ によって参照されていfooます。これが、最後の式が true と評価される理由を説明しています。

foo2 番目のケースで作成するまでに、 prototypeofFooはすでに空のオブジェクトに設定されています。したがって、実質的fooには何も継承しません。同じ原則が 3 番目のケースにも当てはまります。

于 2013-01-27T17:34:10.347 に答える