Javascript 不同对象符号之间的差异

Javascript 不同对象符号之间的差异,javascript,object,web,Javascript,Object,Web,使用内联对象构造函数创建对象和通过立即调用构造函数创建对象有什么区别?我一直在做后者,因为它使我不必自己调用init()之类的东西,我觉得这样做是正确的,但我一直在别人的代码中看到对象符号,我想知道是否还有另一个我没有看到的区别 例如: window.fooModule = { init: function() { this.bar = "cee"; doStuff(); }, doStuff: function() { ... } } wi

使用内联对象构造函数创建对象和通过立即调用构造函数创建对象有什么区别?我一直在做后者,因为它使我不必自己调用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
关键字时,会调用构造函数,并根据其原型创建对象(在本例中,没有声明原型,因此它是标准对象原型)

结论

如果对象必须调用某些代码,请使用第二种表示法 创建时,如果没有,请先使用

关于第二种表示法的更多信息

第二种表示法还允许在构造函数中使用局部(私有)变量和函数,因为构造函数给了我们自己的作用域

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
  };
};
带有构造函数和新的
的第二个符号更常用于标准构造函数函数声明和原型声明。如果我们需要创建多个对象,这是正确的方法。方法和每个共享属性应该在原型中声明,而不是在构造函数中声明。

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
具有相同的原型(可以节省内存),但它们可以在构造函数中设置不同的属性

场外

在javascript中,有很多创建对象的可能性,我有第三个示例如何使用第一个符号运行代码:

window.fooModule = {

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

    return this;//return this
  },

  doStuff: function() {

  }
}.init();//run init after object notation

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

让第一个示例返回obj1,第二个示例返回obj2

obj1将有[[Prototype]]是一个对象。此对象具有构造函数属性为“function object()”

obj2将具有[[Prototype]]是一个对象。此对象具有构造函数属性is匿名函数。

var ExampleClass=function(bar){

   //constructor
   this.bar = bar;
};

ExampleClass.prototype.doStuff=function(){

};
第二个例子中的方法通常用于实现我们称之为“单例”的东西

好处:这些东西很容易混淆,但如果你想更深入地挖掘,这里有一个很好的帖子给你


有对象和对象定义原型。两个示例都不是对象定义原型

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();

第二个,永远不要用啊,太傻了,去掉了旗子,继续!区别在于
doStuff()
在第一个示例中,由于名称错误而失败。我也不确定您要寻找的答案是什么。一个是使用文字对象表示法,另一个是使用对象实例化机制
new
。它们是非常不同的东西。您最终会得到类似的结果,是的。您可能会遇到无限多的变化使用p可以得到相同的最终结果,但是列举它们没有什么意义。您的计算是正确的,但我不同意您的结论。永远不应该使用第二种表示法。如果您需要在创建过程中执行一些代码,请使用IIFE(如模块模式中)。谢谢,但我的观点是,
new
只应在需要创建多个实例时使用,而不应仅用于单个对象,即使有代码要执行。第一种模式也会创建一个单例对象。您所说的“[[Prototype]]是一个对象”是什么意思?你是说结果实际上没有那么不同吗?在javascript上,你不能直接访问对象的原型。但是,你可以访问函数的原型。[[prototype]正是我提到该对象的不可访问原型的方式,很容易与函数的可访问原型进行比较我知道[[prototype]是什么表示法的意思是(您可以通过使用
对象.getPrototypeOf
直接访问它),但您在回答中将它与什么进行比较?“是对象”并没有特别的帮助,很少有对象不适用于它。它们之间的区别在于粗体部分。“对象定义”是什么是吗?对象原型。