存取器描述

当使用存取器描述属性的特性的时候,允许设置以下特性属性:

1 var obj = {};
2 Object.defineProperty(obj,"newKey",{
3     get:function (){} | undefined,
4     set:function (value){} | undefined
5     configurable: true | false
6     enumerable: true | false
7 });

注意:当使用了getter或setter方法,不允许使用writable和value这两个属性

getter/setter

当设置或获取对象的某个属性的值的时候,可以提供getter/setter方法。

  • getter 是一种获得属性值的方法

  • setter是一种设置属性值的方法。

在特性中使用get/set属性来定义对应的方法。

 1 var obj = {};
 2 var initValue = 'hello';
 3 Object.defineProperty(obj,"newKey",{
 4     get:function (){
 5         //当获取值的时候触发的函数
 6         return initValue;    
 7     },
 8     set:function (value){
 9         //当设置值的时候触发的函数,设置的新值通过参数value拿到
10         initValue = value;
11     }
12 });
13 //获取值
14 console.log( obj.newKey );  //hello
15 
16 //设置值
17 obj.newKey = 'change value';
18 
19 console.log( obj.newKey ); //change value

又如:

 1  object.defineProperty (this,'price',{
 2             get:function(){return price*0.9},
 3             set:function(value){
 4                 if(value>10000)
 5                 {
 6                     alert('产品价格必须在0--1万之间');
 7                 }else{
 8                     price=value;
 9                 }
10             }
11         })

注意:get或set不是必须成对出现,任写其一就可以。如果不设置方法,则get和set的默认值为undefined

configurable和enumerable同上面的用法。
兼容性

在ie8下只能在DOM对象上使用,尝试在原生的对象使用 Object.defineProperty()会报错。

原文地址:https://www.cnblogs.com/yangguoe/p/8055889.html