使用内联对象构造函数创建对象和通过立即调用构造函数创建对象有什么区别?我总是完成后者,因为它让我不必自己调用类似init()的东西,感觉这是正确的事情,但我一直在其他人的代码中看到对象符号,并且想知道我是否还有另一个区别没看见。
示例:
window.fooModule = {
init: function() {
this.bar = "cee";
doStuff();
},
doStuff: function() {
...
}
}
window.fooModule.init();
例2:
window.fooModule = new function(){
this.bar = "Cee";
this.doStuff = function() {
...
}
this.doStuff();
}
答案 0 :(得分:1)
在第一个表示法中,变量fooModel
是在没有构造函数调用的情况下创建的,在第二个表示法中fooModel
是通过调用构造函数作为匿名函数创建的对象,因此在使用new
关键字构造函数时是被调用和对象是从它的原型创建的(在这个例子中没有声明原型,因此它是标准对象原型)。
<强>结论强>
如果您的对象必须调用某些代码,请使用第二种表示法 何时创建,如果没有,请先使用。
有关第二种表示法的更多信息
第二种表示法也允许在构造函数中使用局部(私有)变量和函数,因为构造函数给我们自己的范围。
var obj=new function(){
var priv="Local scope variable";
var method=function(){
console.log("Local method");
};
this.doStuff=function(){
//here local methods and variables can be used
};
};
构造函数和new
的第二种表示法更常用于标准构造函数声明和原型声明。如果我们需要创建多个对象,这是正确的方法。 方法和每个共享属性应该在原型中而不是在构造函数中声明。
var ExampleClass=function(bar){
//constructor
this.bar = bar;
};
ExampleClass.prototype.doStuff=function(){
};
创建这样的对象:
var a=new ExampleClass("A bar"); //a.bar is "A bar"
var b=new ExampleClass("B bar"); //b.bar is "B bar"
对象a
和b
具有相同的原型(它可以节省内存),但它们可以在构造函数中设置不同的属性。
<强> OffTop 强>
在javascript中有很多创建对象的可能性,我有第三个例子,如何在第一个表示法中运行代码:
window.fooModule = {
init: function() {
this.bar = "cee";
this.doStuff();
return this;//return this
},
doStuff: function() {
}
}.init();//run init after object notation
我一次创建对象并运行init。
答案 1 :(得分:-1)
让第一个例子返回obj1,第二个例子返回obj2
obj1将[[Prototype]]作为一个对象。该对象的构造函数属性为“function Object()”
obj2将[[Prototype]]作为一个对象。该对象的构造函数属性为匿名函数。
第二个例子中的方法通常用于实现我们称之为“单身”的东西
奖金:这个东西很容易混淆,但如果你想深入挖掘,这里有一个好帖子
https://zeekat.nl/articles/constructors-considered-mildly-confusing.html
答案 2 :(得分:-1)
有对象,并且有对象定义原型。您的示例都不是对象定义原型。
window.fooModule = function(bar){
this.bar = bar;
(this.doStuff = something => {
console.log(this.bar,'is doing', something || 'something');
})();
};
[a,b]= [new fooModule('a'), new fooModule('b')];
如果您只想创建一个对象,则可以跳过new
和this
运算符。
(window.fooModule = {
bar : 'Cee',
doStuff : something => {
console.log(foo.bar,'is doing', something || 'something');
}}).doStuff();