在Javascript中,如果函数是对象数据类型(派生),那么如何将其用作对象构造函数?

时间:2019-03-02 14:04:34

标签: javascript

我的理解是,在javascript函数中是对象。基于这种理解,我已经编写了多年的代码。突然想到这个问题 typeof Objectfunction,但是function是对象。我们使用(构造函数)函数创建一个对象(这是一个对象)。那么哪个先出现呢?对象还是功能?鸡肉还是鸡蛋?

这实际上如何工作?好像是循环引用?

3 个答案:

答案 0 :(得分:0)

Object构造函数由基础JS引擎提供,并且未作为JavaScript程序的一部分创建。

答案 1 :(得分:0)

ObjectFunction都是构造函数。像所有函数一样,它们也是“函数”的类型。由于原型层次结构的原因,它们也是FunctionObject的实例:

console.log(Object instanceof Object)   // true
console.log(Object instanceof Function) // true

console.log(Function instanceof Object)   // true
console.log(Function instanceof Function) // true

这是因为函数是原型链接到对象原型的。

现在,当您调用 Object()时,它会创建一个对象,而不是一个函数:

let o = Object()
console.log(typeof o)              // object
console.log(o instanceof Object)   // true
console.log(o instanceof Function) // false

let f = Function()
console.log(typeof f)              // función
console.log(f instanceof Object)   // true
console.log(f instanceof Function) // true because of prototype linking

因此,没有循环引用,只有一些令人困惑的名称。对象不是函数的实例,但是有一个称为Object()的函数可以调用以产生对象实例。层次结构是对象->功能。函数从对象继承,但是ObjectFunction都是构造函数,它们会产生其对应类型的实例。

答案 2 :(得分:0)

  

我们使用(构造函数)函数创建一个对象(这是一个对象)。那么哪个先出现呢?对象还是功能?鸡肉还是鸡蛋?好像是循环引用?

我们可以使用构造函数创建对象,是的,但这不是唯一的方法。考虑对象文字。
我们可以使用Function构造函数对象创建函数,是的,但这不是唯一的方法。通常使用函数定义来创建函数。

因此,您既不需要对象来创建函数,也不需要函数来创建对象。在典型的JS程序中,它们按照定义/求值的顺序排列。

不过,您可能会问到ObjectFunction。是的,它们和它们的原型对象之间设置了循环引用,但这也不是鸡或蛋的问题。您可以通过简单的分配来创建循环引用。它们之间并不真正相互依赖,这不像是一个用来创建另一个。它们分别存在。哪一个先来?我们不知道,它们都是环境创建的内置对象。我们不在乎,当我们的代码运行时它们都已经存在。