不同对象表示法之间的区别

5 javascript object web

使用内联对象构造函数创建对象和通过立即调用构造函数创建对象有什么区别?我总是完成后者,因为它让我不必自己调用类似init()的东西并感觉这是正确的事情,但我一直在其他人的代码中看到对象符号,并且想知道我是否还有另一个区别没有看到.

例:

window.fooModule = {

  init: function() {
    this.bar = "cee";    
    doStuff();
  },

  doStuff: function() {
    ...
  }
}

window.fooModule.init();
Run Code Online (Sandbox Code Playgroud)

例2:

window.fooModule = new function(){
  this.bar = "Cee";

  this.doStuff = function() {
    ...
  }


  this.doStuff();
}
Run Code Online (Sandbox Code Playgroud)

Mac*_*ora 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
  };
};
Run Code Online (Sandbox Code Playgroud)

第二种表示法与构造函数一起使用,new更常与标准构造函数声明和原型声明一起使用。如果我们需要创建多个对象,这是正确的方法。方法和每个共享属性应在原型中声明,而不是在构造函数中声明。

var ExampleClass=function(bar){

   //constructor
   this.bar = bar;
};

ExampleClass.prototype.doStuff=function(){

};
Run Code Online (Sandbox Code Playgroud)

创建这样的对象:

var a=new ExampleClass("A bar"); //a.bar is "A bar"
var b=new ExampleClass("B bar"); //b.bar is "B bar"
Run Code Online (Sandbox Code Playgroud)

对象ab具有相同的原型(它节省内存),但它们可以在构造函数中设置不同的属性。

关闭顶部

在 javascript 中创建对象的可能性有很多,我有第三个示例如何以第一种表示法运行代码:

window.fooModule = {

  init: function() {
    this.bar = "cee";    
    this.doStuff();

    return this;//return this
  },

  doStuff: function() {

  }
}.init();//run init after object notation
Run Code Online (Sandbox Code Playgroud)

我创建对象并运行 init 一次。