JavaScript 物件实字
优质
小牛编辑
133浏览
2023-12-01
在 JavaScript 最常见也最容易产生一个物件的方式就是用物件实字,但他没有 private、protected,所以就产生了一种撰码风格,以 _ 代表 protected,__ 代表 private,当没有 protected 时 _ 代表 private。
这是一个很简单的物件实字
var dog = { walk: function () { }, run: function () { } };
实作 private
在物件实字的地方如果有需要用 private 属性、方法,那就要透过 closure、立即函式。
写法可能有许多不同的变化,但下面这个是我习惯的作法,用这种方法有几点好处
- 方法写在 return 的地方也可以透过 _this 去操作物件实字
- 在定义时可以按照一般的物件实字写法去写,之后再来定义哪些是可公开的方法、属性
有好处当然也有坏处
- 在物件实字内不能使用 this,必须用 _this,因为之后我们真正去操作的物件实字并不是 _this,而是后面回传的物件实字。
- 要建立两个物件实字,好像有点麻烦…
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!