Object.defineProperty(obj, prop, descriptor)
参数:obj:目标对象
prop:需要定义的属性或方法的名字。
descriptor:目标属性所拥有的特性。
可供定义的特性列表:
* value:属性的值
* writable:如果为false,属性的值就不能被重写。
* get: 一旦目标属性被访问就会调回此方法,并将此方法的运算结果返回用户。
* set:一旦目标属性被赋值,就会调回此方法。
* configurable:如果为false,则任何尝试删除目标属性或修改属性以下特性(writable, configurable, enumerable)的行为将被无效化。
* enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。
利用writable特性轻易实现“不变模式”
查看对象的某个属性的特性状况
try{
var a = {};
Object.defineProperty(a,"bloger",{get:function(){return "司徒正美"}});
alert(a.bloger)
}catch(e){
alert("你的游览器不支持Object.defineProperty ")
}
try{
var b = { };
Object.defineProperty(b, "p", {value:"这是不可改变的默认值" ,writable: false });
alert(b.p)
b.p = "改写!";
alert(b.p)
}catch(e){
alert("你的游览器不支持Object.defineProperty ")
}
try{
var obj = { foo: "test" };
alert(JSON.stringify(Object.getOwnPropertyDescriptor( obj, "foo" )));
}catch(e){
alert("你的游览器不支持Object.defineProperty或 Object.getOwnPropertyDescriptor")
}
"use strict";
try{
var o = {};
Object.defineProperty( o, "attr", {
value: "这是利用defindProperty添加的新属性",
writable: false,
enumerable: true,
configurable: true
});
(function(){
var name = "司徒正美";
//读写器
Object.defineProperty( o, "name", {
get: function(){ return name; },
set: function(value){ name = value+"!"; }
});
})();
alert( o.attr )
// 这是利用defindProperty添加的新属性
alert( o.name ); // 司徒正美
o.name = "ruby louvre";
alert( o.name ); // ruby louvre
alert( Object.keys(o))//attr
try{
o.attr = "试图重写该属性";
}catch(ee){
alert("与writable: false冲突");
}
Object.defineProperty( o, "attr", {
writable: true,
configurable: false
});
o.attr = "再试尝试重写该属性";
alert( o.attr );
alert(delete o.attr); //false 与writable: false冲突
}catch(e){
alert("你的游览器不支持Object.defineProperty ")
}