Chrome主机是否使用全局构造函数来实例化诸如对象,功能之类的全局对象

时间:2019-06-22 11:17:25

标签: javascript constructor javascript-objects v8

我很好奇铬(主机环境)为什么以及如何实例化诸如$data = get_posts( array( 'post_title' => 'Gallery','post_status'=>'inherit') ); Object之类的全局对象。

它是否使用全局FunctionFunction()构造函数,为什么它在以下环境中同时提供构造函数(Function(),Object())和全局对象(Objects,Function)窗口对象。

是因为提供环境(同时提供全局函数和构造函数)对于创建用户脚本中定义的函数和对象是必需的,还是全局构造函数是多余的(因为它们已经实例化了自己的全局对象,即Object,Function)

很抱歉,这听起来很愚蠢,但是我真的没有得到函数对象的概念,这可能是浏览器实现的方法可以在隧道的尽头阐明这一点。

谢谢。

1 个答案:

答案 0 :(得分:2)

在JavaScript中,函数是对象。不要让自己对它们的名称感到困惑,ObjectFunction都是函数(并且像所有函数一样,它们也是对象)。考虑以下具有不同名称的示例:

function my_func() { return 42; }
my_func.property = "hello";    // Functions can have properties.
var my_var = my_func;          // You can store functions in variables.
console.log(typeof my_var);    // "function"
console.log(my_func());        // 42
console.log(my_var());         // 42
console.log(my_var.property);  // "hello"

我可以编写“ function Object(){...}”而不是“ function my_func(){...}”。 (当然,除了会与内置的Object函数怪异地冲突。)

与所有功能一样,Object并不是由其自身构造的。调用new Object()将为您提供一个空对象(就像编写{}一样),它与Object函数不同。这些函数的定义内置在JavaScript引擎中;它们会在启动时使用未暴露给JavaScript的特殊内置代码实例化。

在上面的示例中,观察... = my_func如何引用该函数,然后... = my_func()对其进行调用。同样,Object()实际上是由两部分组成的表达式(Object + ()),它引用并Object函数。因此,在逻辑上不可能使用Object()创建Object,因为这将需要使用尚不存在的东西!换句话说,同时提供ObjectObject()都是一样的:提供Object,并且由于它是一个函数,您可以使用()来调用它。

也许另一个例子会有所帮助。在典型的JavaScript代码中,您具有用户定义的构造函数,例如:

function Fruit(color) {
  this.color = color;
}
Fruit.shape = "curved";

var banana = new Fruit("yellow");
console.log(typeof Fruit);   // "function"
console.log(typeof banana);  // "object"
console.log(banana.shape);   // undefined
console.log(banana.constructor.shape);      // "curved"
console.log(banana === Fruit);              // false
console.log(banana.constructor === Fruit);  // true

观察作为构造函数调用new Fruit()不会给您带来Fruit函数的情况(就像调用new Object()却没有给您带来Object函数一样)。您可以将属性放在Fruit(作为函数,它也是一个对象)上,对其进行访问就像访问其他任何对象属性一样。