var Foo = new function(){
this.A = 1;
this.B = 2;
};
var Bar = {
A: 1,
B: 2
};
typeof Foo === "object"
typeof Bar === "object"
两者有什么区别?
我只发现他们的__proto__
个对象不同:
答案 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
也将是一个普通的对象,更明显不是一个函数。Foo
和Bar
将类似但相同(嗯,两个不同的对象永远不会相同,但我的意思是因为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文档。
答案 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的对象。