Javascript:defineProperty

对象的属性可以按程序员的意愿配置。
set,get方法

var obj = { firstname:"John",lastname:"Smith",};

Object.defineProperty(obj, 'fullname', 
    {
        get : function() { return obj.firstname + " " + obj.lastname },
        set : function( name ){  
                  let arr=name.split(" ");
                  obj.firstname = arr[0];
                  obj.lastname = arr[1];
              }
    }
);

console.log(obj.fullname)
obj.fullname = "Michael Jordan"
console.log(obj.firstname, obj.lastname)

set,get机制是现代化的编程语言的重要机制。此技巧的好处是,不用修改陈旧的代码,就能让貌似直接读写属性的代码,变成间接的经过了set,get函数调用后而读写背后的属性。这实际上是两头占便宜了,一方面,我们不用书写像console.log(obj.getFirstname())这样繁琐的代码,另一方面还享受了getFistname()的服务。

只读属性

var obj = {};

Object.defineProperty(obj, "a",
{
    value: 40,
    writable: false,
});

obj.a=10; //error(strict模式下)或无实际赋值动作

不可枚举的属性
 

var obj = {};
obj.a=10;
obj.b=20;
obj.c=30;

Object.defineProperty(obj, "d",
{
    value: 40,
    enumerable: false
});

for (var tmp in obj)  //看不到d
    console.log(tmp,"  ", obj[tmp])   

不可配置的属性

var obj = {};

Object.defineProperty(obj, "d",
{
    value: 40,
    configurable: false
});

delete obj.d  //删除不掉

console.log(obj.d)  //打印40

配置的意思是,可以改变属性d的只读性,枚举性,set,get方法等。
一旦被设置成不可配置,是一件很好的事情,因为不变性是一个好的特性。
 

你可能感兴趣的:(JavaScript)