`new function(){this.x = 1}`和`{x:1}`之间的区别

时间:2016-04-08 20:26:13

标签: javascript

var Foo = new function(){
    this.A = 1;
    this.B = 2;
};
var Bar = {
    A: 1,
    B: 2
};
typeof Foo === "object"
typeof Bar === "object"

两者有什么区别?

我只发现他们的__proto__个对象不同:

4 个答案:

答案 0 :(得分:0)

行:

var Foo = new function(){
    this.A = 1;
    this.B = 2;
};

我们有var Foo = new 一个函数 - 这意味着运行时将调用该函数,this设置为新构造的对象,其内部原型链接将是设置为该函数的“prototype”属性的值。因为这只是在初始化中实例化的匿名函数,它的“prototype”属性只是一个普通的空对象,所以它实际上什么都不做。构造函数会初始化新对象的两个属性,而新对象是new表达式返回的值。因此,Foo被赋予对该构造对象的引用,并且该对象具有几个分配的属性。它还有一个原型链,它包含来自匿名构造函数的空对象,然后继承自Object构造函数的原型。

在此:

var Bar = {
    A: 1,
    B: 2
};

我们将变量(Bar)设置为对象初始化表达式的结果。这总是创建一个只从Object原型继承的普通对象。此对象与Foo对象不同的唯一方法是Foo对象在其原型链中有一个额外的(空)对象。

<强>所以:

  • Foo最终将成为普通对象,而不是函数。
  • Bar也将是一个普通的对象,更明显不是一个函数。
  • FooBar类似相同(嗯,两个不同的对象永远不会相同,但我的意思是因为Foo在原型链中有额外的空对象。

答案 1 :(得分:-1)

第一个是函数构造函数,它输出一个函数对象(分配给Foo的内容),另一个只是一个普通的javascript对象。

答案 2 :(得分:-1)

在Javascript中,所有函数都是对象。在你的情况下,Foo和Bar是相同的,但你可以构建第一个。

出于同样的原因,我想说在这种情况下构造函数的关键见解是,如果我们有:

function myFoo (){
    this.A = 1;
    this.B = 2;
};

然后

var Foo1 = new myFoo();

上下文是Foo。

var Foo2 = myFoo();
这个绑定到当前上下文,在这种情况下是窗口对象(意味着你实际上有window.A = 1)。

有关更详细的说明,请参阅MDN文档。

https://ideone.com/AZgV9H

Function

Constructor

答案 3 :(得分:-1)

首先注意it's irrelevant that you omitted the parentheses when calling your anonymous function with new。 JSLint会对你大吼大叫,因为这样做会让人感到困惑,但这就是正在发生的事情。

我很确定内部原型是唯一的区别。通常使用它可能更容易写出来。

var Car = function() {
    this.seats = 4;
};

var car1 = new Car();
var car2 = {
    seats: 4
};

读到这一点,我很清楚car1是一个内部原型为Car的对象 - 在你的情况下是一个不是由变量直接保存的匿名函数 - 而car2是内部原型为Object的对象。