传送门
ECMAScript 262v5带来的新东西,FF把它归入为javaScript 1.8.5的功能之一。
语法:
Object.defineProperty(obj, prop, descriptor)
参数:
obj:目标对象
prop:需要定义的属性或方法的名字。
descriptor:目标属性所拥有的特性。
可供定义的特性列表:
- value:属性的值
- writable:如果为false,属性的值就不能被重写。
- get: 一旦目标属性被访问就会调回此方法,并将此方法的运算结果返回用户。
- set:一旦目标属性被赋值,就会调回此方法。
- configurable:如果为false,则任何尝试删除目标属性或修改属性以下特性(writable, configurable, enumerable)的行为将被无效化。
- enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。
try {
var a = {};
Object.defineProperty(a,"bloger",{get:function(){return "司徒正美"}});
alert(a.bloger)
} catch(e) {
alert("你的游览器不支持Object.defineProperty ")
}
利用writable特性轻易实现“不变模式”
try {
var obj = { foo: "test" };
alert(JSON.stringify(Object.getOwnPropertyDescriptor( obj, "foo" )));
} catch(e) {
alert("你的游览器不支持Object.defineProperty或 Object.getOwnPropertyDescriptor")
}
let obj = {
test: "hello"
}
let initVal = 'Hi'
// 对象已有的属性添加特性描述
Object.defineProperty(obj, "test", {
// value: 'world', // 当使用了getter或setter方法,不允许使用writable和value这两个属性
// writable: true,
get: function() {
return initVal;//当获取值的时候触发的函数
},
set: function(value) {
initVal = value;//当设置值的时候触发的函数,设置的新值通过参数value拿到
},
configurable: true,
enumerable: true
});
Object.defineProperty(obj, "newKey", {
value: 'newWorld', // 值
writable: true, // 可否被重写
// get: function(){
// },
// set: function() {
// },
configurable: true, // 是否可以删除目标属性或是否可以再次修改属性的特性
enumerable: true // 可否被枚举 for (let attr in obj){}
});
console.log(obj);
console.log(initVal);
网友评论