JavaScript 物件实字

优质
小牛编辑
131浏览
2023-12-01

在 JavaScript 最常见也最容易产生一个物件的方式就是用物件实字,但他没有 private、protected,所以就产生了一种撰码风格,以 _ 代表 protected,__ 代表 private,当没有 protected 时 _ 代表 private。

这是一个很简单的物件实字

var dog = {
  walk: function () {
  },
  run: function () {
  }
};

实作 private

在物件实字的地方如果有需要用 private 属性、方法,那就要透过 closure、立即函式。

写法可能有许多不同的变化,但下面这个是我习惯的作法,用这种方法有几点好处

  1. 方法写在 return 的地方也可以透过 _this 去操作物件实字
  2. 在定义时可以按照一般的物件实字写法去写,之后再来定义哪些是可公开的方法、属性

有好处当然也有坏处

  1. 在物件实字内不能使用 this,必须用 _this,因为之后我们真正去操作的物件实字并不是 _this,而是后面回传的物件实字。
  2. 要建立两个物件实字,好像有点麻烦…
var dog = (function () {
  var _this = {
    _name: 'Dog';
    getName: function () {
      return _this.name;
    },
    setName: function (name) {
      _this.name = name;
    }
  };
  return {
    getName: _this.getName,
    setName: _this.setName,
    reset: function () {
      _this.name = 'Dog';
    }
  };
})();

自动化 private

这里提供一个方法让大家方便建立有 private 属性、方法的物件实字,这里用之前提过的 _、__ 开头代表 private 这种程式码撰写习惯

function objLiteral(_this) {
  var i, obj = {}, regex = /^_{1,2}/, tmp;

  function _method(method) {
    return function () {
      return method.apply(_this, arguments);
    };
  }

  for (i in _this) {
    if (_this.hasOwnProperty(i)) {
      tmp = _this[i];
      if (!regex.test(i)) {
        obj[i] = (typeof tmp === 'function' ? _method(tmp) : tmp);
      }
    }
  }

  return obj;
}

来建立一个物件实字试试看

var dog = objLiteral({
  _name: 'Dog',
  getName: function () {
    return this._name;
  },
  setName: function (name) {
    this._name = name;
  }
});

dog 底下有 getName、setName,没有 _name,而且 method 里可以使用 this!