对象的属性特性

数据属性

存储器属性

存储器属性不包含数据值,只包含包含 getter 和 setter 函数(非必需)。

getter负责查询值,它不带任何参数,setter则负责设置键值,值是以参数的形式传递,在他的函数体中,一切的return都是无效的。和普通属性不同的是,存储器属性在只声明了get或set时,对于读和写是两者不可兼得的,当它只拥有了getter方法,那么它仅仅只读,同样的,当它只有setter方法,那么您读到的永远都是undefined。如何声明对象存储器属性呢? 最快捷的途径就是利用对象字面量的语法来写了,请看下述一段代码:

1
2
3
4
5
6
7
8
9
var oo = {
name : '贤心',
get sex(){
return 'man';
}
};
//显然这是不允许的,因为贤心并不希望外界去改变他是男性的事实,所以对于sex只设置了只读功能
oo.sex = 'woman';
console.log(oo.sex); //结果依然是man

定义一个已经声明的函数作为的getter和setter方法,使用Object.defineProperty

下面这个例子展示使用getter和setter方法扩展 Date原型,为预定义好的Date类添加一个year的属性。定义属性year的getter和setter方法用到了Date类中已存在的getFullYear和setFullYear方法。

定义属性year的getter和setter:

1
2
3
4
5
6
7
8
9
10
11
var d = Date.prototype;
Object.defineProperty(d, "year", {
get: function() { return this.getFullYear() },
set: function(y) { this.setFullYear(y) }
});

//通过一个Date对象使用getter和setter:
var now = new Date();
console.log(now.year); // 2017
now.year = 2030;
console.log(now);