内置Javascript中的构造函数

时间:2012-03-16 23:22:59

标签: javascript constructor

当我这样做时:

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"}

为什么?

2 个答案:

答案 0 :(得分:4)

因为一些内置函数被定义为以这种方式运行。例如,请参阅ES5 15.2.1.1 for Object

  

15.2.1.1 Object ( [ value ] )

     

如果调用Object函数时没有参数或使用一个参数 value ,则执行以下步骤:

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

他们会测试是否已使用new调用它们,如果不是,则表示已使用new调用它们。

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


您可以自己实现:

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

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

答案 1 :(得分:0)

由于您的示例是内置函数的对象类型,如上所示,它与该类型相同,因此对于大多数其他内置函数(例如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