Javascript中的内置构造函数函数

Built in Constructor functions in Javascript

本文关键字:构造函数 函数 内置 Javascript      更新时间:2023-09-26

当我这样做时:

var person = new Object();  
person.name = "alex";
console.log(person)

输出为:

Object { name="alex"}

然而,说我放弃"新"字,然后做:

var person = Object();  
person.name = "alex";
console.log(person)

输出也是:

Object { name="alex"}

为什么?

因为一些内置函数就是这样定义的。例如,Object:见ES5 15.2.1.1

15.2.1.1对象([值])

Object函数在没有参数或只有一个参数的情况下调用时,将采取以下步骤:

  1. 如果nullundefined或未提供,则创建并返回一个新的Object对象,就像用相同的参数调用标准内置Object构造函数一样(15.2.2.1)
  2. 返回ToObject(value)

他们测试自己是否被new调用过,如果没有,就表现得像被new调用过一样。

并不是所有的构造函数都是这样工作的。例如,当在没有new的情况下调用时,Date将返回一个字符串。


你可以自己实现:

function Foo() {
    if(!(this instanceof Foo)) {
        return new Foo();
    }
    // do other init stuff
}

Foo()new Foo()将以相同的方式进行操作(不过,使用可变参数会变得更加棘手)。

由于您的示例是一个Object类型的内置函数,正如上面所回答的,它对该类型是相同的,因此它对大多数其他内置函数(如Number())的工作方式不同。无论是否使用"new"关键字调用它们,都应该非常小心。因为默认情况下,带有函数构造函数的"new"关键字返回对象,而不是直接返回基元类型。因此,例如,您不能检查两个变量的严格相等性,其中一个变量是使用new Number()声明和分配的,另一个变量使用Number()

例如:

var num1 = Number(26); 
var num2 = new Number(26);
num1 == num2; // returns true
num1 === num2; // returns false

您可以在控制台日志中检查差异:

console.log(num1);
> 26
console.log(num2);
> Number {26}
>     __proto__: Number
>     [[PrimitiveValue]]: 26