JavaScript参考手册
函数 | Function
get
get
语法将对象属性绑定到查询该属性时将被调用的函数。
语法
{get prop() { ... } }
{get [expression]() { ... } }
参数
prop
要绑定到给定函数的属性名。expression从 ECMAScript 2015 开始,还可以使用一个计算属性名的表达式绑定到给定的函数。
描述
有时需要允许访问返回动态计算值的属性,或者你可能需要反映内部变量的状态,而不需要使用显式方法调用。在JavaScript中,可以使用getter 来实现。虽然可以使用 getter 和 setter 来创建一个伪属性类型,但是不可能同时将一个 getter 绑定到一个属性并且该属性实际上具有一个值。
使用get
语法时应注意以下问题:
- 可以使用数值或字符串作为标识;
- 必须不带参数(请参考Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments);
- 它不能与另一个
get
或具有相同属性的数据条目同时出现在一个对象字面量中(不允许使用{ get x() { }, get x() { } }
和{ x: ..., get x() { } }
)。
可通过delete
操作符删除 getter。
示例
在新对象初始化时定义一个getter
这会为obj
创建一个伪属性latest
,它会返回log
数组的最后一个元素。
var obj = {
log: ['test'],
get latest() {
if (this.log.length == 0) return undefined;
return this.log[this.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)
使用计算属性名
var expr = 'foo';
var obj = {
get [expr]() { return 'bar'; }
};
console.log(obj.foo); // "bar"
Smart / self-overwriting / lazy getters
Getters 给你一种方法来定义一个对象的属性,但是在访问它们之前不会计算属性的值。 getter 延续计算值的成本,直到需要值,如果不需要,您就不用支付成本。
一种额外的优化技术是用智能或记忆化 getters 延迟属性值的计算并将其缓存以备以后访问。该值是在第一次调用getter 时计算的,然后被缓存,因此后续访问返回缓存值而不重新计算它。这在以下情况下很有用:
- 如果属性值的计算是昂贵的(占用大量RAM或CPU时间,产生工作线程,检索远程文件等)。
- 如果现在不需要该值。它将在稍后使用,或在某些情况下它根本不使用。
- 如果被使用,它将被访问几次,并且不需要重新计算该值将永远不会被改变,或者不应该被重新计算。
这意味着你不应该为你希望更改其值的属性使用懒 getter,因为 getter 不会重新计算该值。
在以下示例中,对象具有一个 getter 属性。在获取属性时,该属性将从对象中删除并重新添加,但此时将隐式显示为数据属性。最后返回得到值。
get notifier() {
delete this.notifier;
return this.notifier = document.getElementById('bookmarked-notification-anchor');
},
对于Firefox代码,另请参阅定义defineLazyGetter()
函数的XPCOMUtils.jsm代码模块。
规范
Specification |
Status |
Comment |
---|---|---|
ECMAScript 5.1 (ECMA-262)The definition of 'Object Initializer' in that specification. |
Standard |
Initial definition. |
ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'Method definitions' in that specification. |
Standard |
Added computed property names. |
ECMAScript Latest Draft (ECMA-262)The definition of 'Method definitions' in that specification. |
Living Standard |
|
浏览器兼容性
Feature |
Chrome |
Edge |
Firefox (Gecko) |
Internet Explorer |
Opera |
Safari |
---|---|---|---|---|---|---|
Basic support |
1 |
(Yes) |
2.0 (1.8.1) |
9 |
9.5 |
3 |
Computed property names |
46 |
(Yes) |
34 (34) |
No support |
47.0 |
No support |
Feature |
Android |
Chrome for Android |
Edge |
Firefox Mobile (Gecko) |
IE Mobile |
Opera Mobile |
Safari Mobile |
---|---|---|---|---|---|---|---|
Basic support |
(Yes) |
(Yes) |
(Yes) |
1.0 (1.8.1) |
(Yes) |
(Yes) |
(Yes) |
Computed property names |
47 |
No support |
? |
34.0 (34.0) |
No support |
No support |
No support |
函数 | Function相关

JavaScript 是一种高级编程语言,通过解释执行,是一门动态类型,面向对象(基于原型)的解释型语言。它已经由ECMA(欧洲电脑制造商协会)通过 ECMAScript 实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器( Chrome、IE、FireFox、Safari、Opera )支持。JavaScript 是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持 I/O,比如网络