使用内联对象构造函数创建对象与通过立即调用构造函数创建对象有什么区别?我总是做后者,因为它使我不必自己调用 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();
}
最佳答案
在第一个符号中,变量 fooModel
是在没有调用构造函数的情况下创建的对象,在第二个符号中,fooModel
是通过调用构造函数作为匿名函数创建的对象,因此当使用 调用 new
关键字构造函数并从其原型(prototype)创建对象(在此示例中未声明原型(prototype),因此它是标准对象原型(prototype))。
结论
如果您的对象必须调用某些代码,请使用第二种表示法 什么时候创建,没有就先使用。
关于第二种表示法的更多信息
第二个符号也允许在构造函数中使用本地(私有(private))变量和函数,因为构造函数给了我们自己的范围。
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
的第二种表示法更常用于标准构造函数声明和原型(prototype)声明。如果我们需要创建一个以上的对象,这是正确的方法。 方法和每个共享属性应该在原型(prototype)而不是构造函数中声明。
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
具有相同的原型(prototype)(它节省内存)但是它们可以在构造函数中设置不同的属性。
关闭顶部
在 javascript 中有很多创建对象的可能性,我有第三个示例如何以第一种表示法运行代码:
window.fooModule = {
init: function() {
this.bar = "cee";
this.doStuff();
return this;//return this
},
doStuff: function() {
}
}.init();//run init after object notation
我一次创建对象并运行 init。
关于javascript - 不同对象符号之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39411764/