var Foo = new function(){
this.A = 1;
this.B = 2;
};
var Bar = {
A: 1,
B: 2
};
typeof Foo === "object"
typeof Bar === "object"
这两者有何区别呢?我只发现它们的
__proto__
对象不同:
var Foo = new function(){
this.A = 1;
this.B = 2;
};
var Bar = {
A: 1,
B: 2
};
typeof Foo === "object"
typeof Bar === "object"
__proto__
对象不同:
好的:
var Foo = new function(){
this.A = 1;
this.B = 2;
};
var Foo = new
函数,这意味着运行时将使用新构造的对象调用该函数,并将其内部原型链接设置为该函数的"prototype"属性的值。因为那只是在初始化中实例化的一个匿名函数,它的"prototype"属性只是一个普通的空对象,所以它实际上什么也不做。构造函数确实会初始化新对象的两个属性,并且该新对象是new
表达式的返回值。因此,Foo
被分配了对该构造对象的引用,并且该对象具有一些已分配的属性。它还具有一个原型链,其中包括来自匿名构造函数的空对象,然后是从Object构造函数继承的原型。var Bar = {
A: 1,
B: 2
};
我们有一个变量 (Bar
) 被设置为对象初始化表达式的结果。这总是创建一个仅从 Object 原型继承的普通对象。这个对象与 Foo
对象不同的唯一方式是,Foo
对象在其原型链中有一个额外的(空)对象。
所以:
Foo
最终将成为一个普通对象,而不是函数。Bar
也将成为一个普通对象,更明显地不是函数。Foo
和 Bar
将是相似的,但不是相同的(好吧,两个不同的对象永远不会相同,但我指的是它们特定的特征),因为 Foo
在其原型链中具有额外的空对象。function myFoo (){
this.A = 1;
this.B = 2;
};
那么
var Foo1 = new myFoo();
this 上下文是 Foo。
var Foo2 = myFoo();
this绑定到当前上下文,即在这种情况下是window对象(这意味着您实际上有window.A = 1)。
请参阅MDN文档以获取更详细的描述。
()
是可选的! - Pointy首先注意使用new
调用匿名函数时省略括号是无关紧要的。JSLint会警告你这样做很容易引起混淆,但实际上就是这么回事。
我相信内部原型是唯一的区别。按照通常的方式编写可能更容易理解。
var Car = function() {
this.seats = 4;
};
var car1 = new Car();
var car2 = {
seats: 4
};
car1
是一个对象,其内部原型是Car
- 在您的情况下,它是一个不直接由变量持有的匿名函数 - 而car2
是一个对象,其内部原型是Object。car1
的原型将是Car
的“prototype”属性的值,而不是Car
本身。 - PointyFoo
的内容),而另一个则只是一个普通的JavaScript对象。new
运算符调用的这一事实。 - Pointynew
运算符会导致该函数被 调用,并将新构造的对象分配给 Foo。 - Pointynew function(){}
是一个函数构造器,它输出一个函数对象。 - justinledouxwebnew
后跟一个函数会导致该函数立即被调用,结果是创建的新对象。虽然涉及到一个函数,但该函数已被调用,Foo的值将是一个普通对象。在浏览器控制台中自己试试吧! - Pointy
new
运算符调用的。 - Pointy