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