第一个示例为使用该构造函数创建的每个新对象创建一个新函数对象并将其分配给属性,第二个示例创建每个新对象引用的单个函数。
这意味着例如对于您的第一个示例
var fooObj1 = new Foo();
var fooObj2 = new Foo();
alert(fooObj1.bar === fooObj2.bar) //false
而对于第二个
alert(fooObj1.bar === fooObj2.bar) //true
这是因为在第一个示例中,条形属性指的是 2 个单独但相同的对象,而在第二个示例中它们是相同的。
一般而言,建议应在原型上声明函数以保留内存,而应单独声明其他对象,除非您要声明在使用该构造函数创建的所有对象之间共享的“静态”对象。
它更容易看出与普通对象或数组而不是函数的区别
function Foo(){
this.bar = [];
}
var fooObj1 = new Foo();
var fooObj2 = new Foo();
fooObj1.bar.push("x");
alert(fooObj2.bar) //[]
相对于:
function Foo(){
}
Foo.prototype.bar = []
var fooObj1 = new Foo();
var fooObj2 = new Foo();
fooObj1.bar.push("x");
alert(fooObj2.bar) //["x"]