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

Javascript `new function(){this.x=1}`和`x:1}之间的区别`,javascript,Javascript,这两者有什么区别 我只发现他们的\uuuuuuuuuuuuuuu对象不同: 第一个是一个函数构造函数,它输出一个函数对象(分配给Foo),另一个只是一个普通的javascript对象。在javascript中,所有函数都是对象。在您的例子中,Foo和Bar是相同的,但是您可以构造第一个 出于同样的原因,我想说,在这种情况下,构造函数的关键洞察是,如果我们有: var Foo = new function(){ this.A = 1; this.B = 2; }; var Bar

这两者有什么区别

我只发现他们的
\uuuuuuuuuuuuuuu
对象不同:


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

在javascript中,所有函数都是对象。在您的例子中,Foo和Bar是相同的,但是您可以构造第一个

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

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

此上下文的上下文是Foo

var Foo1 = new myFoo();
这被绑定到当前上下文,即本例中的窗口对象(意味着您实际拥有window.A=1)

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

第一个注释。JSLint会对你大喊大叫,因为这样做会让人困惑,但事情就是这样

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

var Foo2 = myFoo();
读到这里,我很清楚,
car1
是一个对象,其内部原型是
Car
——在您的情况下,它是一个匿名函数,不直接由变量持有,
car2
是一个对象,其内部原型是object。

确定:

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

var car1 = new Car();
var car2 = {
    seats: 4
};
我们得到了一个函数,这意味着运行时将调用该函数,并将
this
设置为一个新构造的对象,该对象的内部原型链接将设置为该函数的“prototype”属性的值。因为这只是初始化中实例化的匿名函数,它的“prototype”属性只是一个纯空对象,所以它实际上什么都不做。构造函数初始化新对象的两个属性,新对象是
new
表达式返回的值。因此,
Foo
被指定一个对该构造对象的引用,并且该对象具有两个指定的属性。它还有一个原型链,其中包括匿名构造函数中的空对象,然后是从对象构造函数继承的原型

在这方面:

var Foo = new function(){
    this.A = 1;
    this.B = 2;
};
我们将变量(
Bar
)设置为对象初始值设定项表达式的结果。始终创建仅从对象原型继承的普通对象。此对象与
Foo
对象不同的唯一方式是
Foo
对象在其原型链中有一个额外的(空)对象

所以:

  • Foo
    最终将成为一个普通对象,而不是一个函数
  • Bar
    也将是一个普通对象,更明显的是,它不是一个函数
  • Foo
    Bar
    将是相似但不完全相同的(好吧,两个不同的对象永远不会完全相同,但我的意思是从它们的特殊特性来看),因为
    Foo
    在其原型链中有一个额外的空对象

是的,您发现了差异。它们有不同的原型。除了原型的不同之外,没有太多实际的区别,但是因为原型对第一个对象没有任何影响,所以它什么都不做。你可以把Foo看作一个类,但是Bar是一个object@Ji_in_coding不,Foo只是一个对象。匿名构造函数是由
new
运算符调用的。您没有注意到构造函数是通过
new
运算符调用的。@Pointy我想他是通过“函数构造函数”巧妙地暗示了这一点,但如果准确的话nice@Ji_in_codingFoo只是一个对象;它不是一个函数,也不是一个构造函数。@Pointy,哦,你是对的,我刚刚注意到在function@Pointy很抱歉,它是一个函数构造函数。这是文档:您的答案是正确的,但在这种情况下,Foo和Bar都不是函数。它们都是对象。new function(){},而不是new function(){}()。@djechlin
()
是可选的@尖刻的我在研究这个的时候。。。我会考虑指出答案的一个非常重要的部分。顺便说一句,你应该提交一个答案。@djechlin这个问题变得非常疯狂:)车1的原型将是车的“原型”属性的值,而不是车本身的值。
var Foo = new function(){
    this.A = 1;
    this.B = 2;
};
var Bar = {
    A: 1,
    B: 2
};