函数对象与Javascript对象的关系

时间:2013-04-18 15:30:03

标签: javascript

最近我读了tutorial,其中说明了如下定义函数。

function Animal() { }
  

从表面上看,这段代码似乎创建了一个名为Animal的函数。   但是使用JavaScript,完整的事实会稍微复杂一些。什么   这个代码执行时实际发生的是两个对象   创建。第一个名为Animal的对象是构造函数   本身。第二个对象名为Animal.prototype,它有一个属性   名为Animal.prototype.constructor,指向Animal。动物   有一个属性,指向其原型Animal.prototype。

但我对此一点也不感兴趣。Function对象怎么样?Animal对象的用途是什么?

如果我写下面的代码。

var test= new Function();

我在Chrome的Developer工具中检查了变量test。 我发现testFunction无关。有人可以告诉我为什么吗?感谢。

enter image description here

更新

下图是代码执行时的对象关系,请查看它。 如果我的理解是错误的。请纠正我。感谢。

If my understanding is wrong. please correct me. thanks.

1 个答案:

答案 0 :(得分:3)

该博客文章详细介绍了许多有趣的细节,但大部分时间对大多数人来说都是不必要的混淆。

首先,我们来谈谈功能;忘记原型一分钟。创建函数时:

function Whatever() {
  // ...
}
你创造了一个物体。也就是说,所有函数都是对象,它们是通过Function内置构造函数构造的。此示例中的符号“Whatever”将其值作为对该对象的引用。

给定对函数的引用,可以调用它:

Whatever(); // call the function

可以获取该值(对函数对象的引用)并将其分配给另一个变量,或将其作为参数传递给另一个函数,或者像使用JavaScript中的任何其他值一样使用它。

var another = Whatever;
another(); // also calls the "Whatever" function

显式地通过Function构造函数构造一个函数是很少做的事情,但是它给你一个不起眼的函数。 (在OP中,构造的函数没有做任何事情,因为没有代码传递给Function构造函数。)

现在,当一个函数作为new表达式的一部分被调用时,事情变得有趣。

var test = new Whatever();

通过使用new,实例化一个新对象并将其与“Whatever”函数相关联。 “Whatever”函数是该新对象的构造函数。

每个函数对象,无论是否曾用作构造函数,都有一个关联的“原型”对象。当函数 用作构造函数时,它构造的对象(即,在调用函数的new表达式中创建的对象)与该原型对象隐式关联。

在评估对象属性引用表达式时,原型对象会变得有趣。对象属性引用如下所示:

obj.name
obj[ nameExpression ]

在这样的表达式中,将直接根据对象上的属性集检查属性名称(.表达式中使用的标识符或[ ]内的表达式的值)。如果名称与对象的属性之一不同,则运行时将查询与用于创建对象的构造函数关联的原型对象。

对于大多数人写的大多数代码,这种关系及其一些直接影响是唯一需要担心的事情。你不必愚弄对象的(非标准的)“ proto ”属性,除非你把某种类型的库或框架放在一起。

最后,查看Object.create() function,特别是该文档中显示的“polyfill”可能会有所帮助。