函数和新函数之间的JavaScript差异

时间:2012-05-11 19:06:39

标签: javascript new-operator

以下JavaScript代码对我来说非常混乱。任何人都可以帮助我理解。为什么PersonY没有原型属性。

PersonX = function(){};
PersonY = new function(){};
alert(PersonX.prototype);
alert(PersonY.prototype);    
​

2 个答案:

答案 0 :(得分:34)

PersonX = function(){};

将匿名函数的引用放入PersonXPersonX指向一个函数。

PersonY = new function(){};

将对新构造的匿名构造函数实例的引用放入PersonYPersonY指向一个对象。


关于原型,PersonY有一个原型。但是,由于没有附加到构造函数beforeafter实例化的属性和方法,因此它具有空白原型 *。

您可以通过PersonY实际检查console.log(PersonY)的原型。您将看到它具有原型属性(我在Chrome中将其视为__proto__),这是“空白”。但它有2个隐藏属性,constructor是构成该对象的构造函数,另一个__proto__引导您到下一个“链接”,即Object对象。

*因为原型是链条,所以不是空白。这个原型级别可能是空白的,但是下一个更高的原型可能具有,或者在这种情况下,具有属性和方法。

Object prototype -> Constructor prototype -> Your Instance will have:
- toString()        - blank                  - toString()
- hasOwnProperty()                           - hasOwnProperty()
- and more...                                - and more...
                                             - ...but nothing from Constructor

答案 1 :(得分:0)

那是因为它实际上是在内存中实例化的对象,作为函数的副本;原型实际上只在创建实例的上下文中有意义,所以一旦创建它,​​就没有逻辑结构来表示它的含义。