由匿名函数定义的对象,它是如何工作的?

时间:2018-05-27 21:25:43

标签: javascript interface return

我在网上讲座中看到了这一点,我想知道返回声明是怎么回事?

myAcessors = (function() {
  var data = "data";
  var getData = function() {
    console.log(data);
  };
  var setData = function(val) {
    data = val;
  };
  return {
    getData: getData,
    setData: setData
  };
})();

2 个答案:

答案 0 :(得分:1)

myAcessors是一个包含属性getDatasetData的对象,它们都是函数。

myAcessors = (function() {
  var data = "data";
  var getData = function() {
    console.log(data);
  };
  var setData = function(val) {
    data = val;
  };
  return {
    getData: getData,
    setData: setData
  };
})();

例如,您可以致电myAcessors.getData(),它将返回"data"

使用匿名函数将括号内的所有代码括起来。请注意myAcessors.data不会返回任何内容。这是因为可变数据存在于匿名函数内部并且无法转义,除非您提供了一种方法:即get方法。在您的情况下,您确实有一个get方法:getData将从闭包内返回变量。

您可以说您的属性是私有的,因为没有get方法就无法访问它们。

在JavaScript中声明对象的一种更常见的方法是:

myAcessors = {
  data: "data",
  getData: function() {
    console.log(this.data)
  },
  setData: function(data) {
    this.data = data
  }
}

但是这里 myAcessor.data确实会归还该属性。与其他对象不同,这次您可以访问对象外的所有myAcessor属性。

答案 1 :(得分:1)

实际上这种技术叫做 closure ,它基本上是一个自我初始化函数(在这种情况下)返回一个对象并封装方法上下文。

myAcessors内的函数/变量定义(例如data)将模拟私有方法私有变量。将它们视为闭包函数外部无法访问的静态。

要进一步说明,如果您查看ECMAScript 2015 class语法,myAcessors将如下所示:

class myAcessors {
  static data = 'data';

  getData = () => {
    console.log(this.data);
  };

  setData = val => {
    this.data = val;
  };
}