gpt4 book ai didi

javascript - Function对象和Javascript对象的关系

转载 作者:行者123 更新时间:2023-11-29 19:56:00 25 4
gpt4 key购买 nike

最近我读了一个tutorial上面写着如果像下面这样定义函数。

function Animal() { }

On the surface, this code seems to create a function called Animal. But with JavaScript, the full truth is slightly more complicated. What actually happens when this code executes is that two objects are created. The first object, called Animal, is the constructor function itself. The second object, called Animal.prototype, has a property called Animal.prototype.constructor, which points to Animal. Animal has a property which points back to its prototype, Animal.prototype.

但我对此没有什么困惑。Function 对象呢?Animal 对象有什么用?

如果我编写如下代码。

var test= new Function();

然后我检查了 Chrome 开发者工具中的变量 test。我发现 testFunction 无关。有人能告诉我为什么吗?谢谢。

enter image description here

已更新

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

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

最佳答案

该博文涉及很多细节,这些细节很有趣,但大多数时候对大多数人来说不必要地造成混淆。

首先,让我们谈谈功能;暂时忘记原型(prototype)。创建函数时:

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”函数是该新对象的构造函数。

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

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

obj.name
obj[ nameExpression ]

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

对于大多数人编写的大多数代码,这种关系及其一些直接影响是唯一需要担心的事情。除非您将某种库或框架放在一起,否则您不必随意使用对象的(非标准,目前)“proto”属性。

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

关于javascript - Function对象和Javascript对象的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16087112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com