javascript初始化没有new关键字的对象

时间:2013-08-27 11:51:53

标签: javascript

有什么区别:

function Foo(){} var foo1 = Foo();

var foo2 = new Foo()

据我测试,foo1什么都没有。 typeof foo1未定义,而new是正常的。

没有new关键字我得到未定义结果的原因是什么?

3 个答案:

答案 0 :(得分:3)

这是因为function Foo(){}隐式返回undefined,即如果函数没有显式的return语句,编译器/ VM将隐式添加它。但是,当您使用new关键字时,您可以从构造函数实例化一个对象。

有关new关键字的确切说明,请参阅this answer

答案 1 :(得分:2)

以下是您使用new时基本上发生的事情:

  1. 创建一个新对象,让它为o
  2. o的原型链接设置为[constructor].prototype
  3. 使用[constructor]作为上下文对象(o)执行this
  4. 返回o,除非[consructor]返回非原始值。在这种情况下,返回该非原始值而不是o。 (根据@Esailija的建议添加了这些精度)。
  5. 当您不使用new时,除非在另一个对象上调用该函数,否则不会发生这种情况且上下文对象为window。在这种情况下,上下文对象将是该对象。

    E.g。

    function A() {}
    A(); //this points to window
    
    var o = { A: A };
    
    o.A(); //this points to o
    

    每个function都可以是JavaScript中的构造函数,但您必须使用new关键字才能获得预期的结果。

    为了避免错误,有些人会设计他们的功能,以便忘记new关键字不会有害,如下所示,但有更好的替代方法来检测这些错误,例如使用代码分析工具,如{{3 }}

    E.g。

    function Foo(args) {
        if (!(this instanceof Foo)) {
            return new Foo(args);
        }
        //initialization code
    }
    

答案 2 :(得分:-2)

试试这个

function Foo(){} var foo1 = Foo();

而不是

function Foo(){} var foo1 = foo();

JavaScript是区分大小写的语言