最近我读了tutorial,其中说明了如下定义函数。
function Animal() { }
从表面上看,这段代码似乎创建了一个名为Animal的函数。 但是使用JavaScript,完整的事实会稍微复杂一些。什么 这个代码执行时实际发生的是两个对象 创建。第一个名为Animal的对象是构造函数 本身。第二个对象名为Animal.prototype,它有一个属性 名为Animal.prototype.constructor,指向Animal。动物 有一个属性,指向其原型Animal.prototype。
但我对此一点也不感兴趣。Function
对象怎么样?Animal
对象的用途是什么?
如果我写下面的代码。
var test= new Function();
我在Chrome的Developer工具中检查了变量test
。
我发现test
与Function
无关。有人可以告诉我为什么吗?感谢。
更新
下图是代码执行时的对象关系,请查看它。 如果我的理解是错误的。请纠正我。感谢。
答案 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”可能会有所帮助。