概览
get
语句作为函数绑定在对象的属性上,当访问该属性时调用该函数.
语法
{get prop() { ... } } {get [expression]() { ... } }
参数
prop
- 待绑定函数的属性的名称.
- expression
- 从ECMAScript 6开始, 可以使用表达式作为函数名称绑定在属性上.
说明
有时候希望访问属性时能返回一个动态计算后的值, 或希望不通过使用明确的方法调用而显示内部变量的状态.在JavaScript中, 能通过使用 getter 实现. 尽管可能结合使用getter和setter创建一个伪属性,但不能既使用getter绑定到一个属性上,同时又用该属性真实的存储一个值.
使用get语法时应注意以下问题:
- 可以使用数值或字符串作为标识;
- 必须不带参数 (请参考Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments);
- 在对象字面量中,同一个属性不能有两个get,也不能既有get又有属性键值对(不允许使用
{ get x() { }, get x() { } }
和{ x: ..., get x() { } }
).
可通过 delete
操作符删除getter.
实例
在新对象初始化时定义一个getter
这会为obj创建一个虚假的属性latest
, 该属性会返回log数组的最后一个元素.
var log = ['test']; var obj = { get latest () { if (log.length == 0) return undefined; return log[log.length - 1] } } console.log (obj.latest); // Will return "test".
注意,试图赋给latest新值的话不会改变该值.
使用delete操作符
删除getter
只需使用 delete
,就可删除getter:
delete obj.latest;
使用defineProperty在存在的对象上
定义 getter
在任意时间添加getter到一个存在的对象,使用 Object.defineProperty()
.
var o = { a:0 } Object.defineProperty(o, "b", { get: function () { return this.a + 1; } }); console.log(o.b) // Runs the getter, which yields a + 1 (which is 1)
使用计算后的属性名
注意: 计算后的属性为体验性的技术, 作为 ECMAScript 6 提议的一部分, 暂时还没有被大部分的浏览器支持. 在不支持的环境中使用会引发一个语法错误.
var expr = "foo"; var obj = { get [expr]() { return "bar"; } }; console.log(obj.foo); // "bar"
规范
Specification | Status | Comment |
---|---|---|
ECMAScript 5.1 (ECMA-262) Object Initializer |
Standard | Initial definition. |
ECMAScript 6 (ECMA-262) Method definitions |
Release Candidate | Added computed property names. |
浏览器兼容性
基于 Robert Nyman's page. 不支持 (尤其是在 IE6-8) 表示该脚本会引发语法错误.
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 1 | 2.0 (1.8.1) | 9 | 9.5 | 3 |
Computed property names | 未实现 | 34 (34) | 未实现 | 未实现 | 未实现 |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | 1.0 (1.8.1) | (Yes) | (Yes) | (Yes) |
Computed property names | 未实现 | 未实现 | 34.0 (34.0) | 未实现 | 未实现 | 未实现 |