JavaScript—定义 getters 与 setters
2017-03-04 14:07
204 查看
定义 getters 与 setters
一个 getter 是一个获取某个特定属性的值的方法。一个 setter 是一个设定某个属性的值的方法。你可以为预定义的或用户定义的对象定义getter 和 setter 以支持新增的属性。定义 getter 和 setter 的语法采用对象字面量语法。
下面例子描述了getters 和 setters 是如何为用户定义的对象
o工作的。
var o = { a: 7, get b() { return this.a + 1; }, set c(x) { this.a = x / 2 } }; console.log(o.a); // 7 console.log(o.b); // 8 o.c = 50; console.log(o.a); // 25
o对象的属性如下:
o.a— 数字
o.b— 返回
o.a+
1 的 getter
o.c— 由
o.c
的值所设置 o.a
值的 setter请注意在一个对象字面量语法中定义getter和setter使用"[gs]et property()"的方式(相比较于__define[GS]etter__)时,并不是获取和设置某个属性自身,容易让人误以为是"[gs]et propertyName(){ }"这样错误的使用方法。定义一个getter或setter函数使用语法"[gs]et property()",定义一个已经声明的函数作为的getter和setter方法,使用
Object.defineProperty(或者
Object.prototype.__defineGetter__旧语法回退)
下面这个例子展示使用getter和setter方法扩展
Date原型,为预定义好的Date类添加一个year的属性。定义属性year的getter和setter方法用到了Date类中已存在的getFullYear和setFullYear方法。
定义属性year的getter和setter:
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); // 2000 now.year = 2001; // 987617605170 console.log(now); // Wed Apr 18 11:13:25 GMT-0700 (Pacific Daylight Time) 2001
原则上,getter 和 setter 既可以:
使用 object initializers 定义
也可以之后随时使用 getter 和 setter 添加方法添加到任何对象
当使用 object initializers的方式定义getter和setter时,只需要在getter方法前加get,在setter方法前加set,当然,getter方法必须是无参数的,setter方法只接受一个参数(设置为新值),例如:
var o = { a: 7, get b() { return this.a + 1; }, set c(x) { this.a = x / 2; } };
使用Object.defineProperties的方法,同样也可以对一个已创建的对象在任何时候为其添加getter或setter方法。这个方法的第一个参数是你想定义getter或setter方法的对象,第二个参数是一个对象,这个对象的属性名用作getter或setter的名字,属性名对应的属性值用作定义getter或setter方法的函数,下面是一个例子定义了和前面例子一样的getter和setter方法:
var o = { a:0 } Object.defineProperties(o, { "b": { get: function () { return this.a + 1; } }, "c": { set: function (x) { this.a = x / 2; } } }); o.c = 10 // Runs the setter, which assigns 10 / 2 (5) to the 'a' property console.log(o.b) // Runs the getter, which yields a + 1 or 6
这两种定义方式的选择取决于你的编程风格和手头的工作量。当你定义一个原型准备进行初始化时,可以选择第一种方式,这种方式更简洁和自然。但是,当你需要添加getter和setter方法 —— 因为并没有编写原型或者特定的对象 ——使用第二种方式更好。第二种方式可能更能表现JavaScript语法的动态特性——但也会使代码变得难以阅读和理解。
相关文章推荐
- JavaScript之Getters和Setters 平台支持等详细介绍
- Javascript学习---属性getters和setters
- [翻译] JavaScript之Getters和Setters
- JavaScript Getters and Setters
- JavaScript之Getters和Setters 平台支持等详细介绍
- javascript 对象的定义方法
- Javascript 两种 function 定义的区别
- javascript 对象的定义方法
- 让Pojo的setters和getters做些该做的事情--初始化!
- javascript入门系列演示·函数的定义以及简单参数使用,调用函数
- JavaScript使用prototype定义对象类型(转)[
- Javascript中定义类
- ASP.NET 无法确保在注册的 JavaScript 内不存在重复定义
- Javascript片段 -- 实现窗口最大化的严格定义
- JavaScript中定义类及对象的几种方法
- Javascript 两种定义Function的方法
- 在Javascript中定义对象类别
- 调用javascript遇到奇怪的“函数未定义”问题
- 在Javascript中定义对象类别
- javascript判断变量是否已经定义