1

当新对象被构造时,该对象被设置为将尚未明确设置的任何属性委托给其构造函数的原型。这意味着我们可以稍后更改原型,并且仍然可以看到实例中的更改。

第一的:

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

所以该声明没有按照定义工作。对还是错?但如果我这样做,结果就会不同

第二:

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

 foo.constructor==Foo//false as aspected

再次第三:

  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

请帮助简单的英语。我真的很头疼。

4

2 回答 2

3

为什么会这样

new运算符将实例的继承设置为构造函数的属性当前指向的对象prototype。所以当你这样做时

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

如果有人Foo.prototype在那之后分配给它是无关紧要的 - 它不会改变foo

  • 首先:您获得的继承constructor属性来自“旧”原型 - 一个与函数一起初始化并具有隐藏“构造函数”属性的对象
  • 第二:您正在prototype用一个空对象覆盖该属性,并且您的foo(在覆盖后创建)继承自该属性。并且由于空对象继承自Object.prototype,因此该constructor属性现在指向该Object函数。
  • 第三:同样,您foo在覆盖prototype. 由于您将属性分配给继承自name的新对象,因此您也可以访问它。foofoo
于 2013-01-27T17:32:17.687 回答
1

当您编写一个函数时,它带有一个名为的属性prototype- 一个其constructor属性设置为函数本身的对象。您可能已经知道,JavaScript 的对象模型是基于原型的。这使得您使用该函数创建的对象继承了prototype其构造函数(您调用的那个new)的所有属性 - 因此您应该注意创建prototype对象的时刻

在您的第一种情况下,您只是将prototype属性设置Foo为一个空对象。但是原始(默认)prototype仍然由foo. 这就解释了为什么最后一个表达式的计算结果为真。

当您foo在第二种情况下创建时,prototypeofFoo已经设置为一个空对象。所以几乎foo没有继承任何东西。同样的原则也适用于第三种情况。

于 2013-01-27T17:34:10.347 回答