内置Javascript中的构造函数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (7)

当我做:

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类型,因为上面的答案对于此类型是相同的,因此对于大多数其他内置函数(例如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

用户回答回答于

因为一些内置函数只是定义为以这种方式运行。例如,参见ES5 15.2.1.1Object

15.2.1.1对象([值])Object没有参数或具有一个参数的情况下调用函数时,将执行以下步骤:

  1. 如果nullundefined或者不提供,创造,准确地返回一个新的Object对象,就好像标准的内置对象的构造已经被称为具有相同的参数(15.2.2.1)。
  2. 返回ToObject(value)

他们测试他们是否被调用过new,如果不是他们被调用的话new

并非所有构造函数都像这样工作。例如,Date在没有调用时返回一个字符串new

您可以自己实现:

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

Foo()并将new Foo()以相同的方式行事(尽管变量参数变得更加棘手)。

扫码关注云+社区

领取腾讯云代金券