【问题标题】:3 different types of JavaScript objects, what is the difference?3种不同类型的JavaScript对象,有什么区别?
【发布时间】:2013-06-26 08:36:32
【问题描述】:

我最近一直在深入研究 JavaScript,偶然发现了一个问题。

以下对象的实现有什么区别:

var myFunction1 = (function myFunction1() {})();

var myFunction2 = {}

var myFunction3 = function myFunction3() {}

或者使用执行完全相同任务的三个实现的更长示例。

<script>
    var myFunction1 = (function myFunction1() {

      var _privateVar = 'Private var';
      this.publicVar = 'Public var';

      function init( newPrivate, newPublic) {
        _privateVar = newPrivate;
        this.publicVar = newPublic;
      }

      function getPrivateVar(){
        return _privateVar;
      }

      function setPrivateVar(string){
        _privateVar = string;
      }

      return {
        init: init,
        getPrivateVar: getPrivateVar,
        setPrivateVar: setPrivateVar
      }

    })();

    var myFunction2 = {

      _privateVar: 'Private var',
      publicVar: 'Public var',

      init: function init( newPrivate, newPublic) {
        this._privateVar = newPrivate;
        this.publicVar = newPublic;
      },

      getPrivateVar: function getPrivateVar(){
        return this._privateVar;
      },

      setPrivateVar: function setPrivateVar(string){
        this._privateVar = string;
      }

    }

    var myFunction3 = function myFunction3() {

      var _privateVar = 'Private var';
      this.publicVar = 'Public var';

      function init( newPrivate, newPublic) {
        _privateVar = newPrivate;
        this.publicVar = newPublic;
      }

      function getPrivateVar(){
        return _privateVar;
      }

      function setPrivateVar(string){
        _privateVar = string;
      }

      return {
        init: init,
        getPrivateVar: getPrivateVar,
        setPrivateVar: setPrivateVar
      }

    }

    var a, b, c;
    a = myFunction1;
    a.init('Private var updated', 'Public var updated');
    console.log('== A ==');
    console.log(a.publicVar); // Public var updated
    console.log(a._privateVar); // undefined
    console.log(a.getPrivateVar()); // Private var updated
    a.setPrivateVar('Private var is updated again');
    console.log(a.getPrivateVar()); // Private var is updated again

    b = myFunction2;
    b.init('Private var updated', 'Public var updated');
    console.log('== B ==');
    console.log(b.publicVar); // Public var updated
    console.log(b._privateVar); // Private var updated
    console.log(b.getPrivateVar()); // Private var updated
    b.setPrivateVar('Private var is updated again');
    console.log(b.getPrivateVar()); // Private var is updated again

    c = new myFunction3();
    c.init('Private var updated', 'Public var updated');
    console.log('== C ==');
    console.log(c.publicVar); // Public var updated
    console.log(c._privateVar); // undefined
    console.log(c.getPrivateVar()); // Private var updated
    c.setPrivateVar('Private var is updated again');
    console.log(c.getPrivateVar()); // Private var is updated again
</script>

我知道前两个示例是单例,最后一个允许我创建多个对象。但是前两者有什么区别?或者它们是一样的,只是写的有点不同?

【问题讨论】:

  • 在你的第一个例子中,var myFunction1 = (function myFunction1() {})(); 没有给你一个对象。它将函数的返回值存储到 myFunction1 中。
  • @nderscore 是的,但 myFunction2 不也在做同样的事情吗?
  • 否; myFunction2 不是函数。
  • 花括号有不同的含义,具体取决于它们的使用方式。它们可以表示对象字面量语法、块语句或函数体。
  • ...它们在正则表达式中也有意义。

标签: javascript javascript-objects


【解决方案1】:

在您的第一个示例中,您使用 IIFE (immediately-invoked function expression) 来保持私有状态。

您无法访问 _privateVar,因为在 IIFE 中声明的变量位于闭包中。

【讨论】:

  • 您也无法访问在 myFunction2 中声明的 _privateVar。但我知道我的第二个例子根本不是一个函数。但是功能上的区别是什么?它执行相同的任务?
  • @jamietelin:嗯,不,我可以确认您可以访问 myFunction2 中的 _privateVar。这就是功能上的区别
  • 您是否复制/粘贴并测试了代码?我得到未定义(用输出更新了我的问题)
  • @jamietelin : 做console.log(b._privateVar); 而不是console.log(b.privateVar); ;)
  • AAAAAAAAAAAAAAAAH。正式!
【解决方案2】:

第一个示例创建一个函数myFunction1() 并执行它,将结果(不是函数)存储在变量myFunction1 中——在这种情况下,名称 myFunction1 首先包含一个函数,然后(一旦执​​行)它包含结果。

myFunction2 根本不是一个函数。括号{} 是一个对象字面量,创建一个空对象。

myFunction3 是示例中的唯一函数。在这种情况下,它什么也不做。

【讨论】:

  • 我打字太慢了,cmets 抢了我一半的答案。如果有人想改进这个答案,那就试试吧。
猜你喜欢
  • 2014-03-22
  • 2021-04-02
  • 1970-01-01
  • 2020-02-06
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2011-11-15
相关资源
最近更新 更多