对象的属性可以按程序员的意愿配置。
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方法等。
一旦被设置成不可配置,是一件很好的事情,因为不变性是一个好的特性。