对象文字和返回对象的函数之间有什么区别吗?

时间:2017-09-30 18:10:38

标签: javascript

有人能说出以下两个代码示例之间的区别吗?从结果方面来看,它们几乎相同,但这两个代码片段的用例是什么?引擎盖下的任何差异?在我们用JavaScript创建对象之前,我们需要避免或需要知道的任何陷阱?

var celebrity = {
  celebrityID: 999,
  getID: function ()  {
    return this.celebrityID;
  },
  setID: function (theNewID)  {
    this.celebrityID = theNewID;
  }
}

celebrity.getId(); // 999
celebrity.setId(123);
celebrity.getId(); // 123

Vs以上。

function celebrity () {
  var celebrityID = 999;
  return {
    getID: function ()  {
      return celebrityID;
    },
    setID: function (theNewID)  {
        celebrityID = theNewID;
    }
  }
}


​var obj = celebrity();
obj.getID(); // 999
obj.setID(123); 
obj.getID(); // 123

1 个答案:

答案 0 :(得分:1)

从用例的角度来看,在第一种情况下celebrityID是公开的,这有一个主要的区别,这意味着它有效:

celebrity.celebrityID = "foo"
celebrity.getID() // foo

这通常是不受欢迎的。在第二种情况下,celebrityID是私有的。唯一的访问权限是通过getter / setter:

var obj = celebrity();
obj.celebrityID = "foo";
obj.getID(); // still 999

关于对象文字的函数的另一个好处是,如果要设置初始值,可以传入参数。例如:

function celebrity (val) {
    var celebrityID = val || "Default";
    return {
      getID: function ()  {
      return celebrityID;
     },
     setID: function (theNewID)  {
        celebrityID = theNewID;
     }
   }
  }

var obj = celebrity("Foo");
obj.getID(); // 'Foo'

var obj2 = celebrity();
obj2.getID(); // 'Default'